返回
解密 Leetcode 141:揭秘环型链表的存在性
前端
2023-11-07 10:47:16
引言
链表是一种广泛应用于数据结构中的线性数据结构,它由一组节点组成,每个节点包含数据和指向下一个节点的指针。在某些情况下,链表可能存在环,即最后一个节点指向链表中的某个先前节点,形成一个闭合回路。这种链表称为环型链表。
问题
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),而快慢指针法的