更新时间:2024-02-02 来源:黑马程序员 浏览量:
判断单向链表中是否存在环可以使用快慢指针的方法。这种方法非常有效,而且只需要常数的额外空间。以下是详细的说明:
初始化两个指针,一个称为快指针(fast),另一个称为慢指针(slow),初始时都指向链表的头部。
快指针每次向前移动两步,慢指针每次向前移动一步。
如果存在环,快指针最终会追上慢指针,形成一个循环。如果没有环,快指针将会先到达链表的末尾。
下面是算法的具体步骤:
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),因为只使用了两个指针。