返回

LeetCode 206:反转链表——航海王「路飞」的披荆斩棘之路

前端

[#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 个节点)的基础。

总结:路飞的胜利宣言

经过一番披荆斩棘,我们终于反转了链表,就像路飞成功抵达了伟大航路。反转链表的航海之旅教会了我们逆风而行的勇气、齐心协力的力量以及算法的奇妙。让我们扬起胜利的风帆,继续探索算法的海洋!