给定一个循环链表,补充一个在循环开始时返回节点的算法。
DEFINITION: Cicular Link列表:一个(损坏的)链表,其中节点的下一个指针指向较早的节点,以便在链表中建立一个循环。
实施例: 输入:A-> B-> C-> D-> E-> C [与之前相同的C] 输出:C
答案 0 :(得分:12)
您可以使用tortoise and the hare algortihm:
tortoise
,另一个调用hare
这为循环内部提供了一个元素。要找到循环的开头:
这将允许您查找循环的长度。然后,您只需要步size-length
次查找开头,其中size
是“链接列表”中元素的数量。
这也称为Floyd的循环检测算法。
答案 1 :(得分:1)
检测循环的常用算法是让两个指针/迭代器在列表中前进,一个元素一次前进一个元素,另外两个。如果两个迭代器指向同一个元素,则列表中有一个循环。
找到循环后,您可以收集集合中的所有元素,然后从列表的开头开始,直到找到该集合中的元素。这个元素可以被认为是循环的“开始”
答案 2 :(得分:1)
最简单的算法是使用数据结构来存储已访问过的元素。您可以使用哈希表(关于O(n))或简单的排序数组O(nlog(n))。
您还可以假设您的链接列表是图表,并使用cycle detection常用的算法之一。