Python链表快慢指针找中间元素while循环为何判断fast.next而非fast.next.next
快慢指针法查找链表中间元素的循环条件说明
快慢指针法的常见实现代码如下:
slow = self.head fast = self.head while fast and fast.next: slow = slow.next fast = fast.next.next print("The middle element is ", slow.data)
不能直接用fast.next.next作为循环判断条件的原因
- 首先会触发空指针异常
Python中只要从None对象访问.next属性,就会直接抛出AttributeError。如果直接判断fast.next.next,三种场景都会直接报错:- 链表为空时,
fast本身就是None,访问fast.next就会报错 - 链表只有1个节点时,
fast.next是None,访问fast.next.next会报错 - 当
fast遍历到链表最后一个节点时,fast.next已经是None,访问fast.next.next会报错
- 链表为空时,
- 其次
fast and fast.next利用了Python的短路逻辑,天然规避了空访问风险
该条件的判断顺序是先看fast是否为None,如果是直接终止判断、退出循环;如果fast不为None,再判断fast.next是否为None,全程不会出现非法的空对象属性访问。 - 最后该条件可以同时兼容奇数、偶数长度的链表
- 链表长度为奇数时,循环终止时
fast刚好落在最后一个节点,slow恰好指向正中间的节点 - 链表长度为偶数时,循环终止时
fast为None,slow恰好指向偶数长度下的第二个中间节点,符合多数算法场景的要求。
- 链表长度为奇数时,循环终止时
内容的提问来源于stack exchange,提问作者Rehmy
相关产品推荐
相关产品推荐

