LinkedList Cycle
Comme le montre l'image ci-dessus, écrivez une fonction qui détermine si LinkedList est un cycle.
Solution Utilisez des pointeurs lents et rapides pour parcourir la LinkedList. À chaque itération, le pointeur lent se déplace d'un pas et le pointeur rapide se déplace de deux pas.
S'il n'y a pas de cycle, vous obtiendrez deux résultats.
Si LinkedList a des cycles, le pointeur rapide entre d'abord dans le cycle, suivi du pointeur lent. Après cela, les deux pointeurs continuent à se déplacer indéfiniment dans le cycle. Si vous rencontrez ces deux pointeurs à un stade quelconque, vous pouvez conclure qu'il existe un cycle dans la LinkedList. Analysons si les deux pointeurs peuvent se rencontrer. Il existe deux possibilités lorsque le pointeur rapide s'approche du pointeur lent par l'arrière.
Toutes les autres distances entre les pointeurs rapide et lent se traduisent par l'une de ces deux possibilités. Analysons ces scénarios, en considérant que le pointeur rapide se déplace toujours en premier.
class Node:
def __init__(self, value, next=None):
self.value = value
self.next = next
def has_cycle(head):
# time complexity O(n)
# space complexity O(1)
fast, slow = head, head
while fast is not None and slow is not None:
fast = fast.next.next
slow = slow.next
if fast == slow:
return True
return False
def main():
head = Node(1)
head.next = Node(2)
head.next.next = Node(3)
head.next.next.next = Node(4)
head.next.next.next.next = Node(5)
head.next.next.next.next.next = Node(6)
print("LinkedList has cycle: " + str(has_cycle(head)))
head.next.next.next.next.next.next = head.next.next
print("LinkedList has cycle: " + str(has_cycle(head)))
head.next.next.next.next.next.next = head.next.next.next
print("LinkedList has cycle: " + str(has_cycle(head)))
main()
Recommended Posts