Вы можете использовать алгоритм поиска циклов Флойда , также известный как алгоритм черепахи и зайца . Идея состоит в том, чтобы иметь две ссылки на список и перемещать их с разной скоростью. Переместите один вперед узлом 1
, а другой - узлами 2
.
next
) будет [f6] Функция Java, реализующая алгоритм:
boolean hasLoop(Node first) {
if(first == null) // list does not exist..so no loop either
return false;
Node slow, fast; // create two references.
slow = fast = first; // make both refer to the start of the list
while(true) {
slow = slow.next; // 1 hop
if(fast.next != null)
fast = fast.next.next; // 2 hops
else
return false; // next node null => no loop
if(slow == null || fast == null) // if either hits null..no loop
return false;
if(slow == fast) // if the two ever meet...we must have a loop
return true;
}
}