📜  弗洛伊德循环寻找算法(1)

📅  最后修改于: 2023-12-03 15:09:50.137000             🧑  作者: Mango

弗洛伊德循环寻找算法

弗洛伊德循环寻找算法(Floyd's Cycle-Finding Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一种用于寻找链表中环的算法。这个算法的时间复杂度是 O(n),而且使用的空间非常少,只需要两个指针的空间。

算法思路

弗洛伊德循环寻找算法的思路非常简单。假设有一个链表,如果这个链表有环,那么一定存在一个节点,从这个节点出发,可以绕着环无限次地循环。另外一个节点从链表的头部开始出发,最终也会走到这个节点。

具体实现时,我们使用两个指针,一个指针每次走一步,另一个指针每次走两步。如果链表有环,那么这两个指针一定会相遇在环中的某个节点上。这个过程有点像龟兔赛跑,所以这个算法又叫做龟兔赛跑算法。

实现代码

以下是 Python 实现的弗洛伊德循环寻找算法的代码:

def find_cycle(head):
    # 初始化两个指针
    slow = head
    fast = head

    # 使用快慢指针找到相遇节点
    while fast is not None and fast.next is not None:
        slow = slow.next
        fast = fast.next.next
        if slow == fast:
            break

    # 如果 fast 到达了链表末尾,则不存在环
    if fast is None or fast.next is None:
        return None

    # 将 slow 指针移到链表头部,fast 指针不动
    slow = head

    # fast 和 slow 一起向前走,直到相遇
    while slow != fast:
        slow = slow.next
        fast = fast.next

    return slow

其中,head 是链表的头节点。这个函数会返回链表中环的起始节点。如果链表不存在环,则返回 None

总结

弗洛伊德循环寻找算法是一种非常简单但十分实用的算法。它的时间复杂度非常低,而且只需要极少的存储空间。在寻找链表中环的问题中,它是一种很好的解决方案。