LeetCode-Python-1265. 逆序打印不可变链表 (递归 + 栈)

本文介绍了一种特殊的链表——不可变链表,并探讨了如何逆序打印其节点值的方法。文章提供了三种不同复杂度的解决方案,包括使用递归和栈的O(N)时间与空间复杂度解法,O(1)空间复杂度但O(N^2)时间复杂度的解法,以及一种线性时间、亚线性空间的tricky解法。

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

给您一个不可变的链表,使用下列接口逆序打印每个节点的值:

ImmutableListNode: 描述不可变链表的接口,链表的头节点已给出。
您需要使用以下函数来访问此链表(您 不能 直接访问 ImmutableListNode):

ImmutableListNode.printValue():打印当前节点的值。
ImmutableListNode.getNext():返回下一个节点。
输入只用来内部初始化链表。您不可以通过修改链表解决问题。也就是说,您只能通过上述 API 来操作链表。

 

进阶:

您是否可以:

使用常数级空间复杂度解决问题?
使用线性级时间复杂度和低于线性级空间复杂度解决问题?
 

示例 1:

输入:head = [1,2,3,4]
输出:[4,3,2,1]
示例 2:

输入:head = [0,-4,-1,3,-5]
输出:[-5,3,-1,-4,0]
示例 3:

输入:head = [-2,0,6,4,4,-6]
输出:[-6,4,4,6,0,-2]
 

提示:

链表的长度在 [1, 1000] 之间。
每个节点的值在 [-1000, 1000] 之间。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-immutable-linked-list-in-reverse
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

第一种思路:

时间复杂度:O(N)和空间复杂度: O(N)的解非常好想。

既可以利用递归,又可以利用栈后进先出的特性解题。

递归解:

class Solution(object):
    def printLinkedListInReverse(self, head):
        """
        :type head: ImmutableListNode
        :rtype: None
        """
        if not head:
            return
        self.printLinkedListInReverse(head.getNext())
        head.printValue()

迭代解:

class Solution(object):
    def printLinkedListInReverse(self, head):
        """
        :type head: ImmutableListNode
        :rtype: None
        """
        if not head:
            return
        l = []
        p = head
        while p:
            l.append(p)
            p = p.getNext()

        while l:
            l.pop().printValue()

第二种思路:

空间复杂度为O(1)的解也不难想出。

首先得到链表的总长度 l ,然后依次打印第l个节点, l - 1个节点,l - 2 个节点,

时间复杂度为O(N + N - 1 + N - 2 +....  + 3 + 2 + 1) = O(N^2)

class Solution(object):
    def printLinkedListInReverse(self, head):
        """
        :type head: ImmutableListNode
        :rtype: None
        """
        if not head:
            return
        l = 0
        p = head
        while p:
            l += 1
            p = p.getNext()

        for i in range(l - 1, -1, -1):
            p = head
            for j in range(i):
                p = p.getNext()
            p.printValue()   

第三种思路:

时间线性,空间小于线性的解就有些tricky了。

思路可以看:

https://leetcode.com/discuss/interview-question/124617/Print-out-an-immutable-singly-linked-list-in-reverse/

改日再补实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值