解决循环链表的方法是什么?

时间:2012-06-07 20:34:00

标签: algorithm linked-list

给定一个循环链表,补充一个在循环开始时返回节点的算法。

DEFINITION: Cicular Link列表:一个(损坏的)链表,其中节点的下一个指针指向较早的节点,以便在链表中建立一个循环。

实施例: 输入:A-> B-> C-> D-> E-> C [与之前相同的C] 输出:C

3 个答案:

答案 0 :(得分:12)

您可以使用tortoise and the hare algortihm

  1. 从两个指针开始,调用一个tortoise,另一个调用hare
  2. 在每个时间步骤,将龟推进一次,将野兔推进两次
  3. 重复直到它们相等
  4. 这为循环内部提供了一个元素。要找到循环的开头:

    1. 一次一步地推进乌龟,计算步数
    2. 停止直到你到达野兔
    3. 这将允许您查找循环的长度。然后,您只需要步size-length次查找开头,其中size是“链接列表”中元素的数量。

      这也称为Floyd的循环检测算法。

答案 1 :(得分:1)

检测循环的常用算法是让两个指针/迭代器在列表中前进,一个元素一次前进一个元素,另外两个。如果两个迭代器指向同一个元素,则列表中有一个循环。

找到循环后,您可以收集集合中的所有元素,然后从列表的开头开始,直到找到该集合中的元素。这个元素可以被认为是循环的“开始”

答案 2 :(得分:1)

最简单的算法是使用数据结构来存储已访问过的元素。您可以使用哈希表(关于O(n))或简单的排序数组O(nlog(n))。

您还可以假设您的链接列表是图表,并使用cycle detection常用的算法之一。