返回

解密 Leetcode 141:揭秘环型链表的存在性

前端

引言

链表是一种广泛应用于数据结构中的线性数据结构,它由一组节点组成,每个节点包含数据和指向下一个节点的指针。在某些情况下,链表可能存在环,即最后一个节点指向链表中的某个先前节点,形成一个闭合回路。这种链表称为环型链表。

问题

Leetcode 141 题给出了一个链表,要求判断链表中是否存在环。链表中的每个节点包含一个整数值,并且每个节点都有一个指向下一个节点的指针。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。

方法一:哈希表

一种判断链表中是否存在环的方法是使用哈希表。哈希表是一种数据结构,它可以快速地存储和检索数据。我们可以将链表中的每个节点存储到哈希表中,如果我们发现某个节点已经在哈希表中,则说明链表中存在环。

def has_cycle(head):
    """
    判断链表中是否存在环。

    参数:
        head: 链表的头节点

    返回:
        True 如果链表中存在环,否则返回 False
    """
    # 创建一个哈希表来存储节点
    node_set = set()

    # 遍历链表
    while head:
        # 如果节点已经在哈希表中,则链表中存在环
        if head in node_set:
            return True

        # 将节点添加到哈希表中
        node_set.add(head)

        # 移动到下一个节点
        head = head.next

    # 如果遍历完链表后没有发现环,则链表中不存在环
    return False

方法二:快慢指针

另一种判断链表中是否存在环的方法是使用快慢指针。快指针一次移动两个节点,慢指针一次移动一个节点。如果快指针追上了慢指针,则说明链表中存在环。

def has_cycle(head):
    """
    判断链表中是否存在环。

    参数:
        head: 链表的头节点

    返回:
        True 如果链表中存在环,否则返回 False
    """
    # 创建快指针和慢指针
    slow = head
    fast = head

    # 遍历链表
    while slow and fast and fast.next:
        # 快指针一次移动两个节点
        fast = fast.next.next

        # 慢指针一次移动一个节点
        slow = slow.next

        # 如果快指针追上了慢指针,则链表中存在环
        if slow == fast:
            return True

    # 如果遍历完链表后快指针没有追上慢指针,则链表中不存在环
    return False

结语

在本文中,我们介绍了两种判断链表中是否存在环的方法:哈希表法和快慢指针法。这两种方法各有优劣,哈希表法的时间复杂度为 O(n),空间复杂度为 O(n),而快慢指针法的