在链接列表中查找循环(​​来自破解编码访谈的2.8)

时间:2018-03-05 08:49:28

标签: list loops linked-list find hashtable

这是关于“破解编码面试”一书中的练习2.8。在那里,他们要求在链表中找到一个循环。他们提出了一个快速跑步者/慢跑者的方法,但我找到了一个小得多的解决方案,并想确认我的解决方案是否存在任何类型的问题。

我决定最初创建一个哈希表“all False”,跟踪一个节点是否已被访问过。然后我执行一个循环,直到“当前节点”已经​​被访问,结束循环:

class Node():

    def __init__(self,data=None,next=None):
        if data!=None:
            self.data=data
        self.next=next

def find_loop(head,hash_table):

    node=head

    while hash_table[node]==False:
        print(node.next.data)
        hash_table[node]=True

        node=node.next

    node_at_beginning_of_loop=node
    return node.data


if __name__ == "__main__":
    import sys
    node3=Node()

    node5=Node(11,node3)
    node4=Node(5,node5)
    node3.data=6
    node3.next=node4
    node2=Node(2,node3)
    node1=Node(9,node2)

    hash_table={}

    for i in range(1,6):
        hash_table[globals()['node%s' % i]]=False

    print(find_loop(node1,hash_table))

1 个答案:

答案 0 :(得分:0)

您的解决方案可行,但这不是一个有效的解决方案。空间方面的解决方案。快/慢跑步者是O(n)时间和O(1)空间。您的解决方案是O(n)时间和O(n)空间。此外,您应该在python中使用HashSet / set而不是HashMap / dictionary。