我能够理解floyd循环查找算法的基本原理。我唯一不能理解的是while循环条件,如下所示:
while(slow && fast && fast->next){
slow = slow->next;
/*Moving fast pointer two steps at a time */
fast = fast->next->next;
if(slow == fast){
loop_found = 1;
break;
}
}
因为
fast->next
将移动最快并且首先变为空为什么我们不能把fast->next
放入while
循环中。在这样做的时候,我会错过一些边界条件吗?while(fast->next) instead of `while(slow && fast && fast->next)`
我写了下面的代码,它对奇偶顺序的线性链表都很好。那么,我们是否需要while循环中的
fastPtr
条件,仅用于empty linked list check
。请开导。void linklist::detect()
{
node * fastPtr = new node;
node * slwPtr = new node;
slwPtr = head;
fastPtr = head;
while (/*slwPtr!=NULL && fastPtr!=NULL &&*/ fastPtr->next!=NULL)
{
fastPtr = fastPtr->next->next;
slwPtr = slwPtr->next;
if (fastPtr == slwPtr)
{
cout << "Loop Detected\n";
break;
}
}
}
最佳答案
考虑一个空的链表,其中slow和fast为空,我们需要空检查。由于你所引用的,我们可以避免缓慢的空检查。
while(fast && fast->next) //This should do.
考虑到您的解决方案,由于取消对空指针的引用,我们将以
Segmentation Fault
结束。将添加while检查,以检查节点是否不为空,如下所示:
空链接列表。
fast = NULL
。线性链表,即没有循环(2个节点)。
Consider a linked list 1->2->NULLFirst iteration: fast = 1 and gets modified as fast =NULLSecond iteration: Segmentation fault for while(fast->next)
关于c++ - 而Floyd的循环查找算法中使用的条件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27647349/