我有一种检测链表一个周期下面的代码: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 2013-02-21 05:28:08
但是,你越来越慢,速度更快,没有任何意义。 – smk 2013-02-21 05:29:04
对不起,如果他们的名字很混乱,那是因为我在第一部分中使用它们来检测是否存在循环。一旦我确认了一个循环的存在,我就会将较慢的那个移动到头,在会议场所保持更快,并且每一步都移动它们一次。这就是你的算法描述的。 – Enzo 2013-02-21 05:41:10