Ini kode runnable saya.
Apa yang saya lakukan adalah menghormati daftar yang ditautkan dengan menggunakan tiga node sementara (kompleksitas ruang O(1)
) yang melacak tautan.
Fakta menarik tentang melakukannya adalah untuk membantu mendeteksi siklus dalam daftar yang ditautkan karena ketika Anda maju, Anda tidak berharap untuk kembali ke titik awal (root node) dan salah satu node sementara harus pergi ke nol kecuali Anda memiliki siklus yang berarti menunjuk ke simpul root.
Kompleksitas waktu dari algoritma ini adalah O(n)
dan kompleksitas ruang adalahO(1)
.
Berikut adalah simpul kelas untuk daftar yang ditautkan:
public class LinkedNode{
public LinkedNode next;
}
Berikut adalah kode utama dengan kasus uji sederhana dari tiga node yang menunjuk terakhir ke node kedua:
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;
}
Berikut ini adalah contoh kasus sederhana dari tiga node yang menunjuk ke node kedua:
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?
:)