此代码用于在单个链接列表中查找循环,我从http://blog.ostermiller.org/find-loop-singly-linked-list了解了它,但无法理解为什么代码已经写成它已经写的方式。
该解决方案由 Stephen Osteriller 设计,并由 Daniel Martin 证明为 O(n)。
function boolean hasLoop(Node startNode){
Node currentNode = startNode;
Node checkNode = null;
int since = 0;
int sinceScale = 2;
do {
if (checkNode == currentNode) return true;
if (since >= sinceScale){
checkNode = currentNode;
since = 0;
sinceScale = 2*sinceScale;
}
since++;
} while (currentNode = currentNode.next());
return false;
}
最后也提到了这一点:
这个解决方案是 O(n),因为 sinceScale 随着对 next() 的调用次数线性增长。一旦 sinceScale 大于循环的大小,可能需要再调用一次 next() 来检测循环。