如何检测单链表是否有循环?如果它有循环,那么如何找到循环的起始点,即循环开始的节点。
发布于 2019-01-13 12:40:43
在大多数情况下,前面的所有答案都是正确的,但这里是逻辑的简化版本和可视化代码(适用于Python3.7)
正如其他人解释的那样,逻辑非常简单。我将创建Tortoise/slow和Hare/fast。如果我们以不同的速度移动两个指针,那么最终快将遇到慢!!您也可以将其视为一个tack循环字段中的两个runners。如果跑得快的人继续绕圈跑,它就会遇到/超过跑得慢的人。
因此,我们将在每次迭代中以1的速度移动乌龟/慢指针,同时不断递增或以2的速度移动Hare/fast指针。一旦它们相遇,我们就知道有一个循环。这也称为Floyd's cycle-finding algorithm

以下是执行此操作的Python代码(请注意,has_cycle方法是主要部分):
#!/usr/bin/env python3
class Node:
def __init__(self, data = None):
self.data = data
self.next = None
def strnode (self):
print(self.data)
class LinkedList:
def __init__(self):
self.numnodes = 0
self.head = None
def insertLast(self, data):
newnode = Node(data)
newnode.next = None
if self.head == None:
self.head = newnode
return
lnode = self.head
while lnode.next != None :
lnode = lnode.next
lnode.next = newnode # new node is now the last node
self.numnodes += 1
def has_cycle(self):
slow, fast = self.head ,self.head
while fast != None:
if fast.next != None:
fast = fast.next.next
else:
return False
slow = slow.next
if slow == fast:
print("--slow",slow.data, "fast",fast.data)
return True
return False
linkedList = LinkedList()
linkedList.insertLast("1")
linkedList.insertLast("2")
linkedList.insertLast("3")
# Create a loop for testing
linkedList.head.next.next.next = linkedList.head;
#let's check and see !
print(linkedList.has_cycle())https://stackoverflow.com/questions/10275587
复制相似问题