【发布时间】:2014-12-25 12:49:45
【问题描述】:
我能够理解弗洛伊德的寻环算法的基本原理。唯一我无法理解的是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 仅用于 empty linked list check 的 while 循环中的条件。请赐教。
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;
}
}
}
【问题讨论】: