1.题目描述
2.解题思路(Python版)
方法一:借助数组
思路:
1.创建存储链表结点的数组;
2.遍历链表,同时将遍历的结点存储如数组;
3.倒序输出数组结果。
参考代码:
class Solution:
def printListFromTailToHead(self , listNode: ListNode) -> List[int]:
# write code here
newlist = []
while listNode:
#遍历链表,存入数组中
newlist.append(listNode.val) #.val主要用于获取或设置单元素的值
listNode = listNode.next
#数组反向输出
return newlist[::-1] #[::-1]的作用是对列表进行翻转,还有一种方法是reversed()
#语法:[start : end : step]
#或return list(reversed(newlist))
复杂度:
时间复杂度O(N):N是链表的长度,遍历链表花费时间
空间复杂度O(N):额外存储结点数据花费的空间
方法二:栈
思路:
1.借助栈的先进后出(LIFO)机制,遍历链表的同时将结点元素压入栈;
2.遍历结束依次将站内元素出栈
参考代码:
class Solution:
def printListFromTailToHead(self , listNode: ListNode) -> List[int]:
# write code here
if not listNode: #判断链表是否为空
return []
stack = [] #辅助栈
res = [] #将结果存储在这个数组中
while listNode:
stack.append(listNode.val) #进栈
listNode = listNode.next
while stack:
res.append(stack.pop()) #出栈
return res
复杂度:
时间复杂度O(N):N是链表的长度,遍历链表花费时间
空间复杂度O(N):额外存储栈花费的空间
方法三:递归
思路:
1.每访问到一个结点的时候,先递归输出他后面的结点,再输出该结点自身;
2.辅助变量:一个数组;
3.基线条件(递归结束条件):当前访问的链表结点为空
参考代码:
class Solution: #使用递归的思路实现
def printListFromTailToHead(self , listNode: ListNode) -> List[int]:
# write code here
self.list = [] #空列表,用于存储链表节点的值
if listNode: #递归的结束条件:链表为空
self.printListFromTailToHead(listNode.next) #递归的基本条件
self.list.append(listNode.val) #将当前元素存入列表中
return self.list
#实际运行中报错,因为测试时超过了python的递归深度限制
测试用例通过率84.62%,报错信息如下:
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
表示代码中的递归调用超出了 Python 解释器允许的最大递归深度。Python 默认的递归深度限制通常是 1000 层
复杂度:
时间复杂度O(N):N是链表的长度,递归整个链表
空间复杂度O(N):额外存储逆序数组花费的空间