剑指 Offer 06. 从尾到头打印链表
Posted 炫云云
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 06. 从尾到头打印链表相关的知识,希望对你有一定的参考价值。
剑指 Offer 06. 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
递归法
解题思路:
- 利用递归: 先走至链表末端,回溯时依次将节点值加入列表 ,这样就可以实现链表值的倒序输出。
算法流程:
- 递推阶段: 每次传入
head.next
,以head == None
(即走过链表尾部节点)为递归终止条件,此时返回空列表[]
。 - 回溯阶段: 利用 Python 语言特性,递归回溯时每次返回
当前 list + 当前节点值 [head.val]
,即可实现节点的倒序输出。
复杂度分析:
- 时间复杂度 O ( N ) O(N) O(N) : 遍历链表,递归 N N N 次。
- 空间复杂度 O ( N ) O(N) O(N) : 系统递归需要使用 O ( N ) O(N) O(N) 的栈空间。
# Definition for singly-linked list.
# class ListNode(object):
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution(object):
def reversePrint(self, head):
"""
:type head: ListNode
:rtype: List[int]
"""
return self.reversePrint(head.next) + [head.val] if head else []
辅助栈法
解题思路:
链表特点: 只能从前至后访问每个节点。
题目要求: 倒序输出节点值。
这种 先入后出 的需求可以借助 栈 来实现。
算法流程:
- 入栈: 遍历链表,将各节点值
push
入栈。(Python 使用append()
方法,Java借助 LinkedList 的addLast()
方法)。 - 出栈: 将各节点值 pop 出栈,存储于数组并返回。(Python 直接返回
stack
的倒序列表,Java 新建一个数组,通过popLast()
方法将各元素存入数组,实现倒序输出)。
复杂度分析:
- 时间复杂度 O(N): 入栈和出栈共使用 O(N)时间。
- 空间复杂度 O(N): 辅助栈 stack 和数组 res 共使用 O(N)的额外空间。
class Solution:
def reversePrint(self, head):
stack = []
while head:
stack.append(head.val)
head = head.next
return stack[::-1] # 或者 reverse(res)
以上是关于剑指 Offer 06. 从尾到头打印链表的主要内容,如果未能解决你的问题,请参考以下文章