나는 연결리스트의주기를 검출하기위한 다음과 같은 코드가 있습니다 :Floyd의주기 감지 알고리즘 구현이 올바르지 않습니까?
public Class Node {
Object data;
Node next = null;
}
boolean containCycle() {
boolean retVal = true;
Node head = this;
Node slower = head;
Node faster = head;
if(faster != null && faster.next != null) {
faster = faster.next;
} else { // there is only one element or zero element
retVal = false;
}
if (faster.next != null) {
faster = faster.next;
} else { // there are only 2 elements
retVal = false;
}
while (slower != faster && slower != null && faster != null) {
faster = (faster.next != null && faster.next.next != null) ? faster.next.next : null;
slower = (slower.next != null) ? slower.next : null;
}
if (slower == faster) {
retVal = true;
System.out.printf("The two pointers meet at: %d\n", faster.data);
} else {
retVal = false;
}
if (retVal) { // this is the part for detecting where the loop begins
slower = head;
while(slower.next != faster.next) {
slower = slower.next;
faster = faster.next;
}
System.out.println("The cycle starts at: " + slower.data);
}
return retVal;
}
이 코드는 실제로 루프가 나는 코드에 주석하는, 시작되는 위치를 감지 시작 부분까지 잘 실행됩니다. 여하튼, 이것은 무한 루프로 진행됩니다.
이것이 Java에서 참조로 전달되는 것으로 여겨집니다. 루프를 감지하는 동안 head
이 참조하는 값을 업데이트합니까? 나는 아이디어가 없다. 도와주세요!
이것은 내가 사용하고있는 정확한 알고리즘입니다. 두 번째 절반 (루프 헤드 찾기)에 대한 구현이 작동하지 않으며 무한 루프가 발생합니다. 나는 다른 것들을 많이 시도하고 그들은 모두 제대로 작동하지 않았고, 그래서 정확히 무슨 일이 일어나고 있는지 궁금합니다 ... – Enzo
하지만 당신은 incremeting 모두 천천히 그리고 빠르다 그리고 그 말이 의미가 있습니다. – smk
죄송합니다. 이름이 혼란 스럽다면, 실제로 루프가 있는지 여부를 감지하기 위해 첫 번째 부분에서 사용했기 때문입니다. 일단주기의 존재를 확인하면, 나는 더 느린 사람을 머리 위로 움직이고, 회의 장소에서 더 빠르게 지키고, 한 단계 씩 각각을 움직입니다. 이것은 귀하의 알고리즘이 설명하는 것입니다. – Enzo