c - 检测链表中的多个循环

标签 c algorithm pointers data-structures linked-list

我想在以下情况下检测循环

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

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

在案例 1 中,循环检测算法工作正常,但在案例 2 中却没有。 我对案例 2 进行了试运行,我发现 hare 指针正常结束。 我还认为案例 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/

相关文章:

c++ - 如何降低C/C++中的线程优先级

c - C 中的指针和循环

c - 如何删除列表A中也在列表B中的所有元素?

java - 如何将白色背景更改为黑色

c - Linux block 系统调用

python - 从非常大的列表中删除子列表的高效算法或python的内置函数

c - 黎曼和问题

c - 将 cuda 设备指针传递给主机函数

c++ - 如果我在对象上调用 delete,是否删除了 vector 中的对象指针?

c++ - 何时将指向指针的指针作为参数传递给 C++ 中的函数?