链表中间节点查找:为何while循环条件顺序会引发报错?
快慢指针循环条件顺序引发报错的原因分析
能正常运行的快慢指针代码:
s = f = head while f and f.next: s = s.next f = f.next.next return s
将循环条件顺序调换后触发报错的代码:
s = f = head while f.next and f: s = s.next f = f.next.next return s
对应的报错信息:
AttributeError: 'NoneType' object has no attribute 'next' while f.next and f:
核心原因是Python中逻辑与and运算符的短路求值特性:
- 执行
f and f.next时,程序会先判断f是否非空(不是None)。如果f已经是None,会直接返回False,跳过后面的f.next判断,避免了对None访问属性的错误。 - 但写成
f.next and f时,程序会优先执行f.next的判断。当f是None时,None没有next属性,直接抛出AttributeError,根本没机会执行后面的f是否为空的判断。
举个典型场景:当链表长度为偶数时,最后一次循环迭代后,f会被赋值为None。下一次循环判断时,错误的条件会先尝试访问f.next,直接触发报错;而正确的条件先检测到f是None,直接终止循环,不会出现错误。
内容的提问来源于stack exchange,提问作者user21058410
相关产品推荐
相关产品推荐

