leetcode141环形链表的while条件问题


class Solution(object):
    def hasCycle(self, head):
        """
        :type head: ListNode
        :rtype: bool
        """
        if head == None or head.next == None:
            return False
            
        fast = slow = head
        while head and head.next:
            slow = slow.next
            fast = fast.next.next
            if fast == slow:
                return True
        return False

在判断非空的时候 报错
但是又可以跑得通


AttributeError: 'NoneType' object has no attribute 'next'
    fast = fast.next.next

讲while head and head.next:改成while fast and fast.next:
就可以submit了 这是为什么 求解答

在这个while head and head.next循环中,head和head.next是一直存在,也就是这个循环条件一直为true(因为内部没有改变它), 而fast指针在不断地往后移动,当移动到尾结点的时候,fast.next为null, 那么自然不会存在fast.next.next;所以会报错。
写成whiel head and head.next是一个死循环,直到fast移动到尾结点时保存;
写成while fast and fast.next 在fast移动到尾结点的时候,结束循环,程序正常。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    回答:

    首先要明确的是,while语句中的条件判断需要返回一个布尔值,表示条件是否成立。在Python中,任意对象都可以被当成布尔值使用。当对象为0或者为空,它被视为False,否则被视为True。

    对于给出的环形链表问题,我们需要判断一个链表是否有环。常规的思路是使用快慢指针,如果存在环,快指针一定会追上慢指针。当快指针或者慢指针为空时,就表示该链表不存在环。

    具体到代码上来说,判断条件可以有多种写法,例如:

    while head and head.next:
    

    或者

    while fast and fast.next:
    

    其中,head和fast为链表的指针变量,head.next和fast.next是它们的下一个节点。在Python中,链表最后一个节点的下一个指针为空,因此我们需要保证head.next和fast.next都不为空,才能继续遍历链表。

    因此,将条件判断从“and”改成“or”是不正确的做法,因为“or”条件判断只要有一个对象为True就返回True,这样会导致链表出现问题时仍能够继续遍历,最终会得到错误的结果。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^