题目
876. 链表的中间结点 - 力扣(LeetCode)
快慢指针解法
初始化两个指针:
- 慢指针(slow):每次移动一步
- 快指针(fast):每次移动两步
同时移动两个指针:
- 当fast指针到达链表末尾或者倒数第二个节点时,slow指针正好位于链表的中间位置
- 如果链表长度为奇数,slow指向中间节点
- 如果链表长度为偶数,slow指向第二个中间节点
返回结果:
- 返回slow指针所指的节点
读者可能出现的错误写法
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
while(fast)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};
缺少终止条件检查:
- 这个while循环只检查了fast是否为空,但没有检查fast->next
- 当fast->next为空时,访问fast->next->next会导致空指针错误
指针移动逻辑:
- 如果链表只有一个节点,fast不为空,但fast->next为空
- 此时执行fast = fast->next->next会导致空指针错误
正确的写法
class Solution {
public:
ListNode* middleNode(ListNode* head) {
ListNode* slow = head;
ListNode* fast = head;
while(fast&&fast->next)
{
slow = slow->next;
fast = fast->next->next;
}
return slow;
}
};