链表的中间节点(力扣 876题)
/**
* 题目:给你单链表的头节点 head ,请你找出并返回链表的中间 结点。
* 如果有两个中间结点,则返回第二个中间结点。
* 思路:这道题不知道链表的长度,因此可以先遍历链表得到长度,再n/2得到中间值。
* 不过这样需要遍历两次链表,显然不是我们想要的。
* 因此可以用快慢指针遍历一次链表就得到中间值。slow指针每次走一步,fast指针每次走了两步,当fast指针走到链表末尾时(要么为最后一个节点,要么为null),slow就指向了中间位置
*
*/
class Solution {
public ListNode middleNode(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
fast = fast.next.next;
slow = slow.next;
}
return slow;
}
}