Python 反转链表-reverse linked list Leetcode No.206

博客围绕 LeetCode 中的反转链表问题展开,以链表 1 → 2 → 3 → Ø 为例,介绍将其反转成 Ø ← 1 ← 2 ← 3 的方法。遍历列表时,需存储前一个元素和下一个节点。还给出了迭代和递归两种方式的复杂度分析,迭代时间复杂度 O(n)、空间复杂度 O(1),递归时间复杂度 O(n)、空间复杂度 O(n)。
部署运行你感兴趣的模型镜像

反转链表-reverse linked list


假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3。
在遍历列表时,将当前节点的 next 指针改为指向前一个元素。由于节点没有引用其上一个节点,因此必须事先存储其前一个元素。在更改引用之前,还需要另一个指针来存储下一个节点。不要忘记在最后返回新的头引用!

#非递归的形式
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        cur, prev = head, None
        while cur:
            cur.next, prev, cur = prev, cur, cur.next
        return prev
        

复杂度分析

时间复杂度:O(n),假设 nn 是列表的长度,时间复杂度是 O(n)。
空间复杂度:O(1)。

#递归写法
class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        if head== None or head.next==None:
            return head
        p = self.reverseList(head.next)
        head.next.next, head.next = head, None
#别人的尾递归,无非就是记下前面的,和前面大同小异,但是运行时间好像是快那么一点,不过这都不决定,因为leetccode的运行时间提交多次的时间是不一样的,所以不用那么纠结运行时间,主要还是要分析好,时间复杂度。
class Solution:
    def reverseList(self, head: ListNode, tail=None) -> ListNode:
        if head: head.next, tail, head = tail, head, head.next
        return self.reverseList(head, tail) if head else tail

Leetcode 官方解答已经非常好了,就不重复造轮子了。

复杂度分析

时间复杂度:O(n),假设 nn 是列表的长度,那么时间复杂度为 O(n)。
空间复杂度:O(n),由于使用递归,将会使用隐式栈空间。递归深度可能会达到 n 层。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值