返回
LeetCode 206:反转链表——航海王「路飞」的披荆斩棘之路
前端
2024-02-14 10:35:01
[#leetcode,#链表,#反转,#算法]
前言:航海王「路飞」的启航
大家好,我是你们的航海士「路飞」,今天我们即将扬帆起航,踏上征服 LeetCode 206:“反转链表” 的征途。反转链表就像一场航海冒险,我们需要逆风而行,披荆斩棘,才能抵达胜利的彼岸。
第一步:认识我们的船只——链表
在开始反转链表的征程之前,我们首先需要了解我们的船只——链表。链表是一种线性数据结构,由一系列节点组成,每个节点包含一个值和指向下一个节点的指针。链表就像一串珍珠,每个珍珠代表一个节点,而珍珠之间的线则代表指针。
第二步:航海任务——反转链表
我们的航海任务是反转链表,即把链表中节点的顺序颠倒过来。就像航海时需要逆风而行一样,反转链表也需要我们逆转链表中节点的指针方向。
方法一:递归法——海贼王的绝招
身为海贼王,路飞最擅长的就是用绝招“橡胶机关枪”来打败敌人。同样,在反转链表时,我们也可以使用递归法,像橡胶机关枪一样逐个击破链表中的节点。
def reverse_list_recursively(head):
if head is None or head.next is None:
return head
new_head = reverse_list_recursively(head.next)
head.next.next = head
head.next = None
return new_head
方法二:迭代法——草帽海贼团的齐心协力
除了橡胶机关枪,路飞还有草帽海贼团的伙伴们鼎力相助。在反转链表时,我们可以使用迭代法,让伙伴们齐心协力,逐个反转链表中的节点。
def reverse_list_iteratively(head):
prev = None
current = head
while current is not None:
next_node = current.next
current.next = prev
prev = current
current = next_node
return prev
第三步:实战演练——路飞的航海实战
为了检验我们的反转链表技能,让我们跟随路飞踏上实战演练的航海。
# 创建一个链表
head = ListNode(1)
head.next = ListNode(2)
head.next.next = ListNode(3)
head.next.next.next = ListNode(4)
head.next.next.next.next = ListNode(5)
# 调用反转链表函数
reversed_head = reverse_list_recursively(head)
# 打印反转后的链表
current = reversed_head
while current is not None:
print(current.val, end=" ")
current = current.next
输出结果:
5 4 3 2 1
第四步:应用场景——航海的宝藏
反转链表在现实世界中有着广泛的应用,就如同航海中发现的宝藏一样。
- 数据结构转换: 反转链表可以将单链表转换为双链表或循环链表。
- 查找链表中间节点: 反转链表可以帮助我们高效查找链表的中间节点。
- 解决算法问题: 反转链表是许多算法问题(如回文链表、删除链表倒数第 N 个节点)的基础。
总结:路飞的胜利宣言
经过一番披荆斩棘,我们终于反转了链表,就像路飞成功抵达了伟大航路。反转链表的航海之旅教会了我们逆风而行的勇气、齐心协力的力量以及算法的奇妙。让我们扬起胜利的风帆,继续探索算法的海洋!