我在C中有以下代码,试图查找列表是否循环:

bool findCircular(Node *head)
{
   Node *slower, * faster;
   slower = head;
   faster = head;
   while(true) {

     // if the faster pointer encounters a NULL element
     if( !faster || !faster->next)
       return false;
    //if faster pointer ever equals slower or faster's next
    //pointer is ever equal to slow then it's a circular list
     else if (faster == slower || faster->next == slower)
        return true;
     else{
       // advance the pointers
        slower = slower->next;
        faster = faster->next->next;
      }
   }
}


我对它的某些部分有疑问。第一,我们第一次进入while循环时,难道我们不总是会达到这种情况吗(更快==更快)?我们已经初始化得更快和更慢,以指向它指向头部的相同位置。

其次,为什么我们还要比较(快->下一个==慢),是否仅用faster == slower就不够?

最佳答案

不要同时从faster开始slowerhead。进行错误检查,然后从faster启动head->next

该算法应在没有faster->next ==slower的情况下工作。

关于c - 对查找循环列表算法的怀疑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14860577/

10-10 18:23