一、问题
力扣题目链接:链表的中间结点
二、解题思路
问题的关键也在于我们无法直接得到单链表的长度 n,常规方法也是先遍历链表计算 n,再遍历一次得到第 n / 2 个节点,也就是中间节点。
如果想一次遍历就得到中间节点,也需要耍点小聪明,使用「快慢指针」的技巧:
我们让两个指针 slow 和 fast 分别指向链表头结点 head。
每当慢指针 slow 前进一步,快指针 fast 就前进两步,这样,当 fast 走到链表末尾时,slow 就指向了链表中点。
三、解题代码
public ListNode middleNode(ListNode head) {
ListNode fast =head,slow =head;
while (fast != null && fast.next != null){
slow = slow.next;
fast =fast.next.next;
}
return slow;
}