Для обнаружения цикла в связном списке я бы использовал алгоритм «Черепаха и Заяц» Флойда — эффективный подход, требующий нулевой дополнительной памяти.
Алгоритм использует два указателя, которые одновременно проходят по списку:
slow движется на один шаг за разfast движется на два шага за разЕсли цикл существует, указатель fast в какой-то момент догонит указатель slow и они окажутся в одном узле. Если цикла нет, fast достигнет конца списка.
def has_cycle(head):
slow, fast = head, head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
if slow == fast:
return True
return False
O(n) — каждый указатель проходит по списку не более одного разаO(1) — используются только два указателя, вне зависимости от размера спискаfast достигает None (цикла нет), либо два указателя сходятся (цикл обнаружен)Алгоритм "Черепаха и Заяц" Флойда обнаруживает циклы в связном списке с пространственной сложностью O(1), потому что он использует только постоянное количество указателей независимо от размера списка.
Новый — ещё не проверен сообществом
Вы