而条件用于Floyd的循环寻找算法

时间:2014-12-25 12:49:45

标签: c++ c algorithm

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

    }

}

1 个答案:

答案 0 :(得分:4)

考虑一个空链表,其中slow和fast为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)