You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

链表找中间节点:为何while循环条件顺序不同结果不同?

链表快慢指针条件顺序导致的执行差异

两段代码的核心差异在于逻辑与(&&)的条件顺序,而C/C++中的逻辑与运算符具有短路求值特性——只要左边条件为假,右边条件就不会被执行,这直接决定了代码是否安全。

可行代码分析

ListNode *slow = head, *fast = head;
while (fast && fast->next)
    slow = slow->next, fast = fast->next->next;
return slow;

这段代码先判断fast是否为非空指针:

  • 如果fast是空指针,直接跳过右边的fast->next判断,避免了空指针访问的风险。
  • 只有当fast非空时,才会去检查fast->next,确保后续的fast->next->next操作是安全的。

不可行代码分析

ListNode *slow = head, *fast = head;
while (fast->next && fast)
    slow = slow->next, fast = fast->next->next;
return slow;

这段代码颠倒了条件顺序,先判断fast->next:

  • 当fast是空指针时,直接访问fast->next会触发未定义行为(程序崩溃、输出错误结果等)。比如空链表(head为null)的场景,第一次循环就会直接访问空指针的成员,导致程序出错。
  • 即使链表非空,当循环执行到fast变为空指针时,下一次循环的条件判断依然会先执行fast->next,同样触发空指针访问问题。

典型失败测试用例

  1. 空链表:head = nullptr
    可行代码:fast为null,循环条件不成立,直接返回slow(即head,符合预期)。
    不可行代码:直接执行fast->next,空指针访问导致程序崩溃。

  2. 链表执行后fast变为空指针的场景:比如链表含偶数个节点,循环一次后fast指向null,下一次循环不可行代码会先访问fast->next,触发空指针错误。

内容的提问来源于stack exchange,提问作者AxRy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 10:27:23