返回

LeetCode 141. 环形链表:解决思路、代码实现和注意事项

前端

前言

大家好,我是 LeetCode 刷题达人,致力于从 0 开始刷 LeetCode,记录自己的心得体会和成长历程。今天,我将为大家带来 LeetCode 141. 环形链表 的详细解析,希望对大家有所帮助。

题目

LeetCode 141. 环形链表 的题目如下:

给定一个链表,判断链表中是否含有环。

如果链表中存在环,则返回 true。否则,返回 false。

解决思路

要判断链表中是否存在环,我们可以使用两种常见的算法:

  • 快慢指针法:

    快慢指针法的基本思想是:使用两个指针,一个指针移动一步,另一个指针移动两步。如果链表中存在环,那么这两个指针最终会相遇。

    以下是快慢指针法的具体步骤:

    1. 初始化两个指针,一个指向链表的头部,另一个指向链表的下一个节点。
    2. 同时移动两个指针,一个指针移动一步,另一个指针移动两步。
    3. 如果两个指针相遇,则链表中存在环。
    4. 如果两个指针都没有相遇,直到其中一个指针到达链表的尾部,则链表中不存在环。
  • 集合法:

    集合法的基本思想是:使用一个集合来存储已经遍历过的节点。如果链表中存在环,那么在遍历链表的过程中,某个节点会再次出现。

    以下是集合法的具体步骤:

    1. 初始化一个集合,并将其中的元素设置为链表的头部节点。
    2. 遍历链表,并依次将每个节点添加到集合中。
    3. 如果某个节点已经存在于集合中,则链表中存在环。
    4. 如果链表被遍历完,则链表中不存在环。

代码实现

# 使用快慢指针法判断链表中是否存在环
def has_cycle(head):
    if not head or not head.next:
        return False

    slow = head
    fast = head.next

    while slow != fast:
        if not fast or not fast.next:
            return False

        slow = slow.next
        fast = fast.next.next

    return True


# 使用集合法判断链表中是否存在环
def has_cycle_set(head):
    if not head:
        return False

    visited = set()
    current = head

    while current:
        if current in visited:
            return True

        visited.add(current)
        current = current.next

    return False

注意事项

在解决 LeetCode 141. 环形链表 这道题时,需要注意以下几点:

  • 在使用快慢指针法时,如果两个指针相遇,则链表中存在环。但是,如果两个指针都没有相遇,直到其中一个指针到达链表的尾部,则不能确定链表中不存在环。因为链表可能存在多个环,或者链表可能非常长,导致两个指针无法相遇。因此,在使用快慢指针法时,需要结合集合法来判断链表中是否存在环。
  • 在使用集合法时,需要将每个节点添加到集合中。如果链表中存在环,那么在遍历链表的过程中,某个节点会再次出现。因此,在使用集合法时,需要检查每个节点是否已经存在于集合中。

结语

LeetCode 141. 环形链表 是一道经典的链表题目,也是 LeetCode 的入门级题目之一。通过解决这道题,我们可以学习到链表的基本操作,以及如何使用快慢指针法和集合法来判断链表中是否存在环。希望这篇文章能够对大家有所帮助。

在接下来的文章中,我将继续为大家带来更多 LeetCode 题目的解析。敬请期待!