所以这是我检测循环的代码。我在这里有一个疑问。为什么我在 dic 中查找当前而不是在 dic 中查找当前数据?如果我单独存储节点的值,它会给出错误的答案。当我存储节点而不是节点的值时会发生什么。我正在学习链表,所以我无法掌握当我存储节点本身时会发生什么,以及当我单独存储节点的值时会发生什么。
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
通过比较节点,您可以检查是否在同一个节点对象上运行两次。通过检查该值,您可以忽略两个节点可能共享相同值的情况,因此,您的方法将报告存在一个循环,而实际上没有。如果没有具有重复值的节点,则无关紧要。
如果必须检测链表中的循环,则有一种更简单且节省空间的 2 个指针的方法 取两个引用或指针(快和慢)。 "快"移动两个速度,每次"慢"移动一个; 像快=快>下一个>下一个和慢=慢>下一个。如果它们在任何时候再次相遇,那么链接列表中就会有一个循环