链表While循环疑问:为何用head.next而非head判空?
链表环判断代码的循环条件疑问解析
先看你的代码里的前置判断:
if head is None or head.next is None: return False
这行已经直接排除了空链表和只有一个节点的链表(这两种情况不可能有环),所以进入循环时,head一定不是空,且head.next必然存在。
原循环条件while head.next is not None:的逻辑
这个条件的设计是为了只处理有后继节点的节点:
- 每次循环检查
head.next是否在已遍历的集合中——如果链表有环,某个节点的next必然会指向之前出现过的节点,这时候直接返回True - 把
head.next加入集合后,head移动到下一个节点 - 当链表无环时,遍历到最后一个节点时,
head.next是None,循环直接终止,不会去处理None,逻辑紧凑且无冗余操作
替换成while head is not None:的情况
最终判断结果确实和原代码一致,但会多做一次无效操作:
- 当遍历到最后一个节点时,
head.next是None,这时候会执行if None in previous(集合里存的都是链表节点对象,肯定不存在),然后把None加入集合,接着head变成None,循环结束 - 这步操作对判断结果没有影响,但完全没必要,属于多余的计算和存储
总结
在现有代码的前置判断下,两种循环条件的最终结果相同,但原代码的循环条件更严谨,避免了对None的无效处理,效率略高。如果替换成while head is not None:也能运行,但逻辑上不如原代码紧凑,还会额外存储一个None在集合中。
内容的提问来源于stack exchange,提问作者user16791235
相关产品推荐
相关产品推荐

