4 python algorithm linked-list data-structures
有人可以让我知道证明链表包含循环的最佳方法吗?我正在使用一个带有两个指针的算法,一个步骤缓慢移动一步,另一个步骤移动得更快.
class Node(object):
def __init__(self, value, next=None):
self.next=next
self.value=value
def create_list():
last = Node(8)
head = Node(7, last)
head = Node(6, head)
head = Node(5, head)
head = Node(4, head)
head = Node(3, head)
head = Node(2, head)
head = Node(1, head)
last.next = head
return head
def is_circular(head):
slow = head
fast = head
while True:
slow = slow.next
fast = fast.next.next
print slow.value, fast.value
if slow.value == fast.value:
return True
elif slow is fast:
return False
if __name__ == "__main__":
node = create_list()
print is_circular(node)
Run Code Online (Sandbox Code Playgroud)
Ste*_* P. 13
一个好的算法如下,它可能是最好的.你不需要复制列表或任何东西,就像那样,它可以在恒定的空间中完成.
拿两个指针并将它们设置到列表的开头.
让一次增加一个节点,一次增加另外两个节点.
如果列表中的任何点都存在循环,则它们必须在某个点(不包括起始点)指向同一节点.显然,如果到达列表的末尾,则没有循环.
编辑:
您的代码,但略有编辑:
def is_circular(head):
slow = head
fast = head
while fast != None:
slow = slow.next
if fast.next != None:
fast = fast.next.next
else:
return False
if slow is fast:
return True
return False
Run Code Online (Sandbox Code Playgroud)