题目描述:
给定一个头节点为 head 的非空单链表,返回链表的中间节点。
如果有两个中间节点,则返回第二个中间节点。
示例:
输入:[1,2,3,4,5]
输出:此列表中的节点 3
思路分析:
要找到链表的中间节点,可以定义两个指针,一个是慢指针slow,另一个是快指针fast。初始,慢指针slow和快指针fast都指向链表的头节点。然后,快指针fast每次向前移动两步,慢指针slow每次向前移动一步,当快指针fast不能继续向前移动时,慢指针slow所指的节点就是中间节点。
对于节点个数为奇数的链表来说,其中间节点只有一个;而对于节点个数为偶数的链表来说,其中间节点有两个。
接着,我们就通过动画来看下如何通过快慢指针找到链表的中间节点。
1.当快指针fast向前移动的条件是:fast.next!=null && fast.next.next != null时:
对于节点个数为奇数的链表来说,动画演示如下,此时链表的中间节点是节点3。

对于节点个数为偶数的链表来说,动画演示如下,此时链表的中间节点是节点2,即在2和3这两个中间节点中,找到是第一个中间节点。

2.当快指针fast向前移动的条件是:fast!=null && fast.next != null时:
对于节点个数为奇数的链表来说,动画演示如下,此时链表的中间节点是节点3。

对于节点个数为偶数的链表来说,动画演示如下,此时链表的中间节点是节点3,即在2和3这两个中间节点中,找到是第二个中间节点。

题目要求的是如果有两个中间节点,则返回第二个中间节点。因此,对于该题目而言,快指针fast向前移动的条件是:fast!=null && fast.next != null。
代码实现:
public ListNode middleNode(ListNode head){
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast= fast.next.next;
}
return slow;
}
本文通过图解方式详细介绍了如何利用快慢指针找到链表的中间节点,特别是当链表有两个中间节点时,如何找到第二个中间节点。通过设置快指针每次前进两步,慢指针每次前进一步,当快指针无法再前进时,慢指针位置即为第二个中间节点。文章还给出了不同节点数量情况下,快慢指针移动的动画演示,并提供了相应的代码实现。
505

被折叠的 条评论
为什么被折叠?



