一尘不染

查找单链列表是否为循环/循环的有效算法是什么?

algorithm

如何查找单链接列表是否为循环/循环?我尝试搜索,但找不到满意的解决方案。如果可能,您能否提供伪代码或Java实现?

例如:
1→交通3→交通5→交通71→交通45→交通7→交通5,其中第二个5实际上是列表的第三个元素。


阅读 204

收藏
2020-07-28

共1个答案

一尘不染

标准答案是在开始时使用两个迭代器,将第一个迭代器递增一次,然后将第二个迭代器递增两次。检查它们是否指向同一对象。然后重复,直到增加两次的那个碰到第一个或到达终点。

该算法可以在列表中找到任何圆形链接,而不仅仅是一个完整的圆形。

伪代码(不是J​​ava,未经测试-超出我的脑海)

bool hasCircle(List l)
{
   Iterator i = l.begin(), j = l.begin();
   while (true) {
      // increment the iterators, if either is at the end, you're done, no circle
      if (i.hasNext())  i = i.next(); else return false;

      // second iterator is travelling twice as fast as first
      if (j.hasNext())  j = j.next(); else return false;
      if (j.hasNext())  j = j.next(); else return false;

      // this should be whatever test shows that the two
      // iterators are pointing at the same place
      if (i.getObject() == j.getObject()) { 
          return true;
      } 
   }
}
2020-07-28