首页常见问题正文

单向链表长度未知,如何判断其中是否有环?

更新时间:2024-02-02 来源:黑马程序员 浏览量:

IT培训班

  判断单向链表中是否存在环可以使用快慢指针的方法。这种方法非常有效,而且只需要常数的额外空间。以下是详细的说明:

  1.快慢指针初始化:

  初始化两个指针,一个称为快指针(fast),另一个称为慢指针(slow),初始时都指向链表的头部。

  2.移动指针:

  快指针每次向前移动两步,慢指针每次向前移动一步。

1706840930388_单向链表长度未知怎么判断其中是否有环.jpg

  3.检测环:

  如果存在环,快指针最终会追上慢指针,形成一个循环。如果没有环,快指针将会先到达链表的末尾。

  下面是算法的具体步骤:

class ListNode:
    def __init__(self, value):
        self.value = value
        self.next = None

def has_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:
            return True

    # 如果快指针到达链表末尾,说明没有环
    return False

  这个算法的关键在于快指针每次走两步,而慢指针每次走一步。如果存在环,快指针最终会在某一时刻与慢指针相遇。如果没有环,快指针会先到达链表的末尾。

  这个方法的时间复杂度是O(N),其中N是链表的长度,因为在最坏情况下,快指针需要遍历整个链表。空间复杂度是 O(1),因为只使用了两个指针。

分享到:
在线咨询 我要报名
和我们在线交谈!