返回
链式旅行:LeetCode 算法之旅,领略环形链表的神奇奥妙
前端
2023-10-16 10:39:59
问题背景
LeetCode 算法题库中有一道题名为“环形链表 II”的题目,难度为中等。题目给定一个链表,判断是否存在环,若存在,则找到环的入口节点。
链式结构与算法中很多基础性的概念与操作息息相关。理解了链表,就会理解很多关键的算法与数据结构的原理。同时,环形链表与动态规划、分治法有着相似之处的概念,例如哈希法,动态规划、快慢指针法。
解法一:哈希表法
哈希表法是解决环形链表问题的一种经典方法。算法思路如下:
- 创建一个哈希表,将链表中的节点作为键值对存储其中。
- 遍历链表,将每个节点依次插入哈希表。
- 若在哈希表中发现某个节点已存在,则说明存在环,此时该节点即为环的入口节点。
- 若遍历完整个链表都没有发现环,则返回空,说明链表中不存在环。
代码实现:
def hasCycle(head):
# 创建一个哈希表来存储节点
hash_table = set()
# 遍历链表,将每个节点依次插入哈希表
while head:
if head in hash_table:
return True
hash_table.add(head)
head = head.next
# 如果遍历完整个链表都没有发现环,则返回空
return False
解法二:快慢指针法
快慢指针法也是解决环形链表问题的一种高效方法。算法思路如下:
- 定义两个指针,分别命名为快指针和慢指针。
- 从链表头结点出发,快指针每次移动两步,慢指针每次移动一步。
- 若快指针和慢指针相遇,则说明存在环,此时相遇点即为环的入口节点。
- 若快指针到达链表尾结点,则说明链表中不存在环,返回空。
代码实现:
def hasCycle(head):
# 定义快指针和慢指针
slow_pointer = head
fast_pointer = head
# 从链表头结点出发,快指针每次移动两步,慢指针每次移动一步
while fast_pointer and fast_pointer.next:
slow_pointer = slow_pointer.next
fast_pointer = fast_pointer.next.next
# 若快指针和慢指针相遇,则说明存在环,返回 True
if slow_pointer == fast_pointer:
return True
# 如果快指针到达链表尾结点,则说明链表中不存在环,返回 False
return False
总结
环形链表问题是 LeetCode 算法题库中的一道经典题目,具有很强的代表性。通过对这道题的学习,我们可以掌握解决环形链表问题的两种经典方法:哈希表法和快慢指针法。
环形链表 II 题目的解题过程,也是算法学习者的一个成长过程。在解决算法问题时,我们要敢于尝试不同的方法,不断磨练自己的思维能力。希望这篇博文对正在学习算法的你有所帮助。
参考资料