链表循环检测基本问题

时间:2019-08-26 04:15:48

标签: python loops data-structures linked-list

这是我检测循环的代码。我在这里有疑问。为什么我要在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

2 个答案:

答案 0 :(得分:1)

通过比较节点,您正在检查是否在同一节点对象上运行了两次。通过检查该值,您将忽略两个节点可能共享同一值的情况,因此,您的方法将报告确实存在一个循环,而实际上没有。如果没有具有重复值的节点,那就没关系了。

答案 1 :(得分:0)

如果必须检测链表中的循环,则有一种更简单且节省空间的2指针方法 取两个引用或指针(快和慢)。 “快”移动两步,每次“慢”移动一秒; 例如fast = fast-> next-> next和slow = slow-> next。如果他们在任何时候都再次相遇,那么链表中就会有一个循环