我想在下列情况下检测环路

1-2-3-4-5
|----------| ===> case 1

1-2-3-4-5
|-------|    ===> case 2

在情况1循环检测算法工作正常,但不适用于情况2。
我对案例2进行了试运行,发现兔子指针末端正常。
另外,我认为案例2不是有效的单链表,因为它包含2个下一个指针。
我的假设对案例2正确吗?
整个场景是针对单链表的?

最佳答案

以下是不涉及分配堆内存的循环检测解决方案:

struct Node {
   int val;
   struct node * next;
};

bool containsCycle(Node * head)
{
   Node * walker = head;
   NOde * fastWalker = head;
   while(walker && fastWalker)
   {
      fastWalker = fastWalker->next;
      if(walker == fastWalker)
         return true;
      if(fastWalker)
        fastWalker = fastWalker->next;
      if(walker == fastWalker)
         return true;
      walker = walker->next;
   }
   // Fell out of the loop, no cycle
   return false;
}

这个算法使用两个指针,以不同的速度前进如果列表中有一个循环,则两个指针将在一个点上彼此相等。

关于c - 在链表中检测多个循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11875659/

10-11 16:36