踩坑记录[5]——LeetCode 876题:链表的中间结点
题目描述
-
给你单链表的头结点
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
- 链表的结点数范围是
答案(C++语言,已通过LeetCode测试)
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode *fast = head, *slow = head;
int count = 0;
while(fast != nullptr && fast->next != nullptr){
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
};
踩坑记录
题目难度:简单
本题目为双指针题型,核心解题思想:定义两个指针快慢指针,快的走两步,当快的走到头,慢的恰好位于中间。
本文较为简单,但需要注意:
-
无论是偶数个结点还是奇数个结点,最终都是返回
slow
对于第
t
步(已经触发循环结束条件),此时指针所在位置(第一个结点为1
)为fast: 2t+1
,slow: t+1
,可知它们一定是奇数。如果一共有奇数个结点,那么当前fast就位于最后一个结点上,此时,
slow
所在的位置t+1
就是中间位置。如果一共有偶数个结点,由于已经触发结束条件,那么当前
fast
肯定位于最后一个点的下一个位置,最后一个结点的位置为2t
,此时中间位置为t
和t+1
。题目要求返回第二个结点,正好是t+1
,也就是slow
。具体来说,这里奇数个结点和偶数个结点触发的停止训练条件不同:
奇数:fast->next == nullptr
偶数:
fast == nullptr