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

LeetCode #83疑问:while cur和cur.next顺序不同的差异及报错原因

解答:两种while循环条件的区别与报错原因

嘿,我来帮你理清楚这个问题,这其实涉及到Python里短路求值的特性,很常见的新手坑,别担心~

核心区别:短路求值的顺序

Python的逻辑运算符and是短路求值的,意思是如果第一个表达式已经能决定整个条件的结果,就不会再去计算第二个表达式。我们来分别拆解两种写法:

1. while cur and cur.next:

这个条件会先检查cur是否为None:

  • 如果cur是None(比如链表为空,或者遍历到了链表末尾之后),整个and条件直接为False,循环不会执行,也不会去访问cur.next,完美避免了错误。
  • 如果cur不是None,才会继续检查cur.next是否存在,这时候访问cur.next是安全的,因为cur已经被确认是有效的ListNode对象。

2. while cur.next and cur:

这个条件会先检查cur.next:

  • 如果cur是None(比如链表为空时,cur = head就是None),这时候你尝试访问cur.next,就会触发AttributeError: 'NoneType' object has no attribute 'next',也就是你遇到的运行错误。
  • 只有当cur本身不是None的时候,这个写法才和第一种效果一样,但它完全没处理cur为None的前置场景。

关于cur = head的写法

这个写法完全没问题!head本身可能是None(空链表的情况),但第一种while条件正好能处理这种情况:当head是None时,cur就是None,循环直接跳过,最后返回head(也就是None),完全符合逻辑。

举两个具体场景验证

  1. 空链表场景:

    • 第一种写法:cur是None,while cur and cur.next直接为False,循环不执行,返回None,正确。
    • 第二种写法:先判断cur.next,但cur是None,直接触发报错,因为None没有next属性。
  2. 遍历到链表最后一个节点:

    • cur是最后一个节点,cur.next是None,第一种条件cur and cur.next为False,循环结束,正确。
    • 第二种条件cur.next and cur先判断cur.next是None,整个条件为False,循环也结束,这时候是没问题的,但它的致命问题出在cur为None的前置场景。

总结

  • 一定要把可能为None的变量放在and的前面,利用短路求值避免访问None的属性。
  • cur = head的写法是正确的,它能覆盖空链表的情况,配合正确的while条件就没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:06:10