python每日一题【剑指 Offer 24. 反转链表】

本文围绕LeetCode的剑指Offer 24.反转链表题目展开。介绍题目为输入链表头节点,反转链表并输出新头节点,给出示例。同时提供两种题解,指针法用pre和next暂存节点来建立新连接;递归法从后往前修改节点next,还指出一个丢失头节点的错误递归例子。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

day4-2022.10.27

题目信息来源:
作者:Krahets
链接:https://leetcode.cn/leetbook/read/illustration-of-algorithm
来源:力扣(LeetCode)

剑指 Offer 24. 反转链表

定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。

示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

题解:指针法

用pre和next暂存前一节点和后一节点,再断开连接,建立新的连接

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        self.pre = None
        self.next = None
        while head:
            self.next = head.next
            head.next = self.pre
            self.pre = head
            head = self.next
        return self.pre

题解:递归法

  1. 递归就是递归到next为0的节点,然后返回,将之间的节点的next改为节点的pre,所以考虑构造一个函数,传递节点和节点的pre,递归结果,依次返回,修改节点的next
  2. 但是这样会存在一个问题,依次返回后,新的倒序列表的头节点会消失,故需要将头节点在每次递归回去的都需要传递,就里的head,它从最开始的now=none时返回的pre,之后一直没有变过
  3. 递归法的next修改从最后面开始修改,和指针法相比,不需要一个暂存的next来保留下一个head,或者暂存一个pre来保留前一个head
class Solution:
    def trans(self, now:ListNode, pre:ListNode) -> ListNode:
        if now==None:return pre # 递归的终止条件,一般写在最前面,这里返回了头节点
        head = self.trans(now.next, now)# 递归,保留头节点
        now.next = pre # 递归到最后,返回时才开始修改next为前一节点
        return head #继续传递头节点
        
    def reverseList(self, head: ListNode) -> ListNode:
        return self.trans(head, None)

一个错误的递归例子,丢失了头节点

class Solution:
    def trans(self, now:ListNode, pre:ListNode) -> ListNode:
        if now==None:return pre
        now = self.trans(now.next, now)
        now.next = pre
        return pre
        
    def reverseList(self, head: ListNode) -> ListNode:
        return self.trans(head, None)                                                                                       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

piukaty

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值