力扣 876. 链表的中间结点【详细手写】
一、题目
二、思路
设置快慢指针遍历链表,慢指针每次移动一个节点,快指针是慢指针速度的2倍,这样相同时间内,快指针移动的节点数就是慢指针的2倍。那么,当快指针移动到最后一个节点时,慢指针移动到中间节点的位置。大致思路为以上描述,具体需要分链表节点个数为奇数还是偶数,详细思路见下图:
三、代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode middleNode(ListNode head) {
ListNode slow = head, fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
return slow;
}
}