ดังนั้นฉันจึงเพิ่งพบอัลกอริทึมเพื่อพิจารณาว่ามีวงจรอยู่ในรายการที่เชื่อมโยงหรือไม่ รหัสมีดังนี้:
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;
}
เมื่อพยายามพิสูจน์ความถูกต้องของอัลกอริทึมนี้ ฉันเกิดแนวคิดขึ้นมา: สมมติว่าเส้นรอบวงของวงจรคือ "a" เวลาที่ผ่านไปก่อนที่พอยน์เตอร์สองตัวจะพบกันคือ "t" เนื่องจากความเร็วของโหนด "เร็ว" เคลื่อนที่เร็วเป็นสองเท่าของโหนด "ช้า" เราจึงสามารถได้ความสัมพันธ์ทางคณิตศาสตร์:
2t mod a = เสื้อ mod a
ตอนนี้ "a" เป็นค่าคงที่แทนเส้นรอบรูป และ "t" อาจเป็น 1,2,3.... แล้ว ฉันจะพิสูจน์ได้อย่างไรว่าไม่ว่าค่า "a" จะเป็นเท่าใด เราก็สามารถหา "t" ดังกล่าวได้เสมอ ว่าสมการข้างต้นแก้ได้?
t = 0 mod a
ใด ๆ แก้2t = t mod a
คุณต้องมีt >= s
ด้วย โดยจะต้องs
ขั้นตอนเพื่อเข้าสู่วงจร - person Matt Timmermans   schedule 06.10.2016