그래서 최근에 사이클이 연결된 목록에 있는지 여부를 확인하는 알고리즘을 발견했습니다.연결된 목록에 루프가 있는지 여부를 확인하는 알고리즘
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;
}
이 알고리즘의 정확성을 증명하려고, 나는 아이디어를 제공 :주기의 경계 "가"입니다 가정 , 만나는 두 개의 포인터까지의 시간을 다음과 같이 코드는 "티". 은 "빠른"노드의 속도가 "느린"노드로 두 배 빠른 속도로 이동하기 때문에, 우리는 수학적 관계를 얻을 수 있습니다 :
2t 모드 A는 = t A가
는 상수가 나타내는 자 "는"있는 MOD 둘레와 "t"는 1,2,3 ... 일 수 있습니다. 그런 다음, "a"값이 무엇이든 위의 방정식을 풀 수있는 "t"를 항상 찾을 수 있다는 것을 어떻게 증명할 수 있습니까?
http://stackoverflow.com/q/2936213/1835769 – displayName
주기가 첫 번째 노드에서 시작되지 않으면 공식이 올바른가요? 예 : 1-> 2, 2-> 3, 3-> 4, 4-> 5, 5-> 3,주기 = {3,4,5,3} – shole
't = 0 mod a'는'2t = t mod a'이다. 't> = s'도 필요합니다. 여기서's' 단계가주기를 입력합니다. –