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移动到尾结点的时候,结束循环,程序正常。
回答:
首先要明确的是,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,这样会导致链表出现问题时仍能够继续遍历,最终会得到错误的结果。