我能够理解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/

10-13 03:27