问题描述
给你单链表的头结点 head
,请你找出并返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。
示例 1:
输入:head = [1,2,3,4,5]
输出:[3,4,5]
解释:链表只有一个中间结点,值为 3 。
示例 2:
输入:head = [1,2,3,4,5,6]
输出:[4,5,6]
解释:该链表有两个中间结点,值分别为 3 和 4 ,返回第二个结点。
提示:
- 链表的结点数范围是
[1, 100]
1 <= Node.val <= 100
解法一:快慢指针
下面的 for 循环结束后,fast == nil
或 fast.Next == nil
,即 fast 指向空节点或当前链表的最后一个节点。由于 fast 每次走两步,故最终走的步数是偶数。如果 fast 最后指向的是空节点,则表明链表节点的数目为偶数,此时 slow 指向两个中间节点中靠后的那一个。如果 fast 最后指向链表最后一个节点,则表明此时链表的数目为奇数,此时 slow 指向唯一的中间节点。
|
|
拓展
当链表节点数目为偶数时,如何获取两个中间节点中靠前的那一个?
先处理 head == nil
的特殊情况,后将 for 循环的进入条件由 fast != nil && fast.Next != nil
改为 fast.Next != nil && fast.Next.Next != nil
即可。代码如下:
|
|