【问题标题】:While Condition used in Floyd's cycle-finding algorithm弗洛伊德寻环算法中使用的 While 条件
【发布时间】: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;
        }

    }

}

【问题讨论】:

    标签: c++ c algorithm


    【解决方案1】:

    考虑一个空链表,其中慢速和快速为空,我们需要适当的空检查。由于您引用的内容,我们可以避免缓慢的 null 检查。

    while(fast && fast->next) //This should do.
    

    考虑到您的解决方案,由于取消引用 Null 指针,我们将在 Segmentation Fault 结束。

    添加了while检查以检查节点是否不为NULL,如在这些情况下:

    • 空链接列表。 fast = NULL
    • 线性链接列表,即没有循环(2 个节点)。 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)

    【讨论】:

    • 所以这意味着 fast 部分仅用于空链接列表检查。如果可以忽略这种情况,那么我们最好使用 while(fast->next)
    • 空节点检查。可能有两种情况。当你有一个空链表或一个没有循环的线性链表时。
    • 尝试奇数和偶数节点。
    • 我在主要问题部分放了一个代码,它对偶数和奇数都有效。你能调查一下吗。我在这里错过了什么吗?
    猜你喜欢
    • 2011-04-22
    • 2013-03-28
    • 2018-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    相关资源
    最近更新 更多