我能够理解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
移动速度最快,因此首先会变为NULL。为什么我们不能将fast->next
放在while
循环中。虽然这样做会让我在某些边界条件下失踪吗?
while(fast->next) instead of `while(slow && fast && fast->next)`
我写下面的代码,它对偶数和奇数有序线性链表都很好。那么,我们是否只需要fastPtr
的while循环中的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;
}
}
}
答案 0 :(得分:4)
考虑一个空链表,其中slow和fast为null,我们需要进行空检查。由于你所引用的内容,我们可以避免慢速空检查。
while(fast && fast->next) //This should do.
考虑到您的解决方案,由于取消引用Null指针,我们最终会进入Segmentation Fault
。
添加while检查以检查节点是否为NULL,如下所示:
fast = NULL
。
Consider a linked list 1->2->NULL
First iteration: fast = 1 and gets modified as fast =NULL
Second iteration: Segmentation fault for while(fast->next)