这是我检测循环的代码。我在这里有疑问。为什么我要在dic中查找current而不是在dic中查找current.data?如果我仅存储节点的值,则会给出错误的答案。当我存储节点而不是节点的值时会发生什么。我正在学习链表,因此我无法掌握存储Node本身时发生的情况以及仅存储Node值时发生的情况。
def detectLoop(head):
dic={}
current=head
flag=5
while current is not None:
if current in dic:
flag=6
break
else:
dic[current]=5
current=current.next
if flag==5:
return False
else:
return True
答案 0 :(得分:1)
通过比较节点,您正在检查是否在同一节点对象上运行了两次。通过检查该值,您将忽略两个节点可能共享同一值的情况,因此,您的方法将报告确实存在一个循环,而实际上没有。如果没有具有重复值的节点,那就没关系了。
答案 1 :(得分:0)
如果必须检测链表中的循环,则有一种更简单且节省空间的2指针方法 取两个引用或指针(快和慢)。 “快”移动两步,每次“慢”移动一秒; 例如fast = fast-> next-> next和slow = slow-> next。如果他们在任何时候都再次相遇,那么链表中就会有一个循环