Oto mój kod do uruchomienia.
To, co zrobiłem, to ujawnienie połączonej listy za pomocą trzech tymczasowych węzłów (złożoność przestrzeni O(1)
), które śledzą łącza.
Ciekawym faktem jest to, że pomaga wykryć cykl na połączonej liście, ponieważ w miarę postępu nie spodziewasz się powrotu do punktu początkowego (węzła głównego), a jeden z tymczasowych węzłów powinien przejść do wartości zerowej, chyba że mają cykl, co oznacza, że wskazuje na węzeł główny.
Złożoność czasowa tego algorytmu jest, O(n)
a złożoność przestrzeni jest O(1)
.
Oto węzeł klasy dla listy połączonej:
public class LinkedNode{
public LinkedNode next;
}
Oto główny kod z prostym przypadkiem testowym trzech węzłów, które ostatni węzeł wskazuje na drugi węzeł:
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;
}
Oto prosty przypadek testowy trzech węzłów, które ostatni węzeł wskazuje na drugi węzeł:
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?
:)