Вот мой исполняемый код.
Что я сделал, так это почитал связанный список, используя три временных узла (сложность пространства O(1)), которые отслеживают ссылки.
Интересный факт в этом состоит в том, чтобы помочь обнаружить цикл в связанном списке, потому что по мере продвижения вперед вы не ожидаете возврата к начальной точке (корневому узлу), а один из временных узлов должен обнуляться, если только вы есть цикл, который означает, что он указывает на корневой узел.
Временная сложность этого алгоритма равна, O(n)а сложность пространства равна O(1).
Вот узел класса для связанного списка:
public class LinkedNode{
public LinkedNode next;
}
Вот основной код с простым тестовым примером из трех узлов, последний узел которого указывает на второй узел:
public static boolean checkLoopInLinkedList(LinkedNode root){
if (root == null || root.next == null) return false;
LinkedNode current1 = root, current2 = root.next, current3 = root.next.next;
root.next = null;
current2.next = current1;
while(current3 != null){
if(current3 == root) return true;
current1 = current2;
current2 = current3;
current3 = current3.next;
current2.next = current1;
}
return false;
}
Вот простой тестовый пример трех узлов, которые последний узел указывает на второй узел:
public class questions{
public static void main(String [] args){
LinkedNode n1 = new LinkedNode();
LinkedNode n2 = new LinkedNode();
LinkedNode n3 = new LinkedNode();
n1.next = n2;
n2.next = n3;
n3.next = n2;
System.out.print(checkLoopInLinkedList(n1));
}
}
finite amount of space and a reasonable amount of time?:)