如何查找单链接列表是否为循环/循环?我尝试搜索,但找不到满意的解决方案。如果可能,您能否提供伪代码或Java实现?
例如: 1→交通3→交通5→交通71→交通45→交通7→交通5,其中第二个5实际上是列表的第三个元素。
1
3
5
71
45
7
标准答案是在开始时使用两个迭代器,将第一个迭代器递增一次,然后将第二个迭代器递增两次。检查它们是否指向同一对象。然后重复,直到增加两次的那个碰到第一个或到达终点。
该算法可以在列表中找到任何圆形链接,而不仅仅是一个完整的圆形。
伪代码(不是Java,未经测试-超出我的脑海)
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; } } }