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),完全符合逻辑。
举两个具体场景验证
空链表场景:
- 第一种写法:
cur是None,while cur and cur.next直接为False,循环不执行,返回None,正确。 - 第二种写法:先判断
cur.next,但cur是None,直接触发报错,因为None没有next属性。
- 第一种写法:
遍历到链表最后一个节点:
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
相关产品推荐
相关产品推荐

