Jadi saya baru-baru ini menemukan algoritma untuk menentukan apakah suatu siklus ada dalam daftar tertaut. Kode-kodenya adalah sebagai berikut:
public boolean hasCycle(ListNode head) {
if (head == null) {
return false;
}
ListNode fast = head;
ListNode slow = head;
while (fast != null) {
if (fast.next == null) {
return false;
}
if (fast.next == slow) {
return true;
}
fast = fast.next.next;
slow = slow.next;
}
return false;
}
Saat mencoba membuktikan kebenaran algoritma ini, saya mendapat ide: Misalkan keliling siklus adalah "a", waktu yang berlalu sebelum dua penunjuk bertemu adalah "t". Karena kecepatan simpul "cepat" bergerak dua kali lebih cepat dari simpul "lambat", kita dapat memperoleh hubungan matematisnya:
2t mod a = t mod a
Sekarang "a" adalah konstanta yang mewakili keliling, dan "t" bisa jadi 1,2,3.... Lalu, bagaimana cara membuktikan bahwa berapa pun nilai "a", kita selalu dapat menemukan "t" seperti itu apakah persamaan di atas dapat diselesaikan?
t = 0 mod a
memecahkan2t = t mod a
. Anda juga memerlukant >= s
, yang memerlukans
langkah untuk memasuki siklus. - person Matt Timmermans   schedule 06.10.2016