链表找中间节点:为何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,同样触发空指针访问问题。
典型失败测试用例
空链表:
head = nullptr
可行代码:fast为null,循环条件不成立,直接返回slow(即head,符合预期)。
不可行代码:直接执行fast->next,空指针访问导致程序崩溃。链表执行后
fast变为空指针的场景:比如链表含偶数个节点,循环一次后fast指向null,下一次循环不可行代码会先访问fast->next,触发空指针错误。
内容的提问来源于stack exchange,提问作者AxRy
相关产品推荐
相关产品推荐

