06 从尾到头打印链表
题目
法一 辅助栈法 时间:O(n) 空间:O(n)
算法流程
输入的是链表的头结点,节点的值为val,下一个地址为next,不能直接将节点添加到list中
- 创建list栈来保存节点的值
如果节点不为空,则将节点的值添加到list
如果节点为空,则将list倒着输出 - list元素翻转可采用两个方法
调用reverse函数,再输出list
直接输出list[::-1]
复杂度
时间复杂度O(n):while循环遍历链表O(n)
空间复杂度O(n): 使用list的空间O(n)
代码
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
list=[]
while head:
list.append(head.val)
head=head.next
list.reverse()
return list
法二 递归法 时间:O(n) 空间:O(n)
算法流程
递推阶段: 每次传入 head.next ,以 head == None(即走过链表尾部节点)为递归终止条件,此时返回空列表 [] 。
回溯阶段: 利用 Python 语言特性,递归回溯时每次返回 当前 list + 当前节点值 [head.val] ,即可实现节点的倒序输出。
复杂度
时间复杂度O(n):遍历链表O(n)
空间复杂度O(n): 系统递归需要O(n)的栈空间
代码
class Solution:
def reversePrint(self, head: ListNode) -> List[int]:
return self.reversePrint(head.next) + [head.val] if head else []