原文链接: https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof
中文题目
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2] 输出:[2,3,1]
限制:
0 <= 链表长度 <= 10000
通过代码
高赞题解
方法一:递归法
解题思路:
利用递归: 先走至链表末端,回溯时依次将节点值加入列表 ,这样就可以实现链表值的倒序输出。
Python 算法流程:
- 递推阶段: 每次传入
head.next
,以head == None
(即走过链表尾部节点)为递归终止条件,此时返回空列表[]
。 - 回溯阶段: 利用 Python 语言特性,递归回溯时每次返回
当前 list + 当前节点值 [head.val]
,即可实现节点的倒序输出。
- 递推阶段: 每次传入
Java 算法流程:
- 递推阶段: 每次传入
head.next
,以head == null
(即走过链表尾部节点)为递归终止条件,此时直接返回。 - 回溯阶段: 层层回溯时,将当前节点值加入列表,即
tmp.add(head.val)
。 - 最终,将列表
tmp
转化为数组res
,并返回即可。
- 递推阶段: 每次传入
复杂度分析:
- 时间复杂度 $O(N)$: 遍历链表,递归 $N$ 次。
- 空间复杂度 $O(N)$: 系统递归需要使用 $O(N)$ 的栈空间。
图解以 Python 代码为例, Java 原理一致,只是把利用返回值改为
add()
操作。
<,
,
,
,
,
,
,
,
,
>
代码:
[]class Solution: def reversePrint(self, head: ListNode) -> List[int]: return self.reversePrint(head.next) + [head.val] if head else []
[]class Solution { ArrayList<Integer> tmp = new ArrayList<Integer>(); public int[] reversePrint(ListNode head) { recur(head); int[] res = new int[tmp.size()]; for(int i = 0; i < res.length; i++) res[i] = tmp.get(i); return res; } void recur(ListNode head) { if(head == null) return; recur(head.next); tmp.add(head.val); } }
方法二:辅助栈法
解题思路:
链表特点: 只能从前至后访问每个节点。
题目要求: 倒序输出节点值。
这种 先入后出 的需求可以借助 栈 来实现。
- 算法流程:
- 入栈: 遍历链表,将各节点值
push
入栈。(Python 使用append()
方法,Java借助LinkedList
的addLast()
方法)。 - 出栈: 将各节点值
pop
出栈,存储于数组并返回。(Python 直接返回stack
的倒序列表,Java 新建一个数组,通过popLast()
方法将各元素存入数组,实现倒序输出)。
- 入栈: 遍历链表,将各节点值
复杂度分析:
- 时间复杂度 $O(N)$: 入栈和出栈共使用 $O(N)$ 时间。
- 空间复杂度 $O(N)$: 辅助栈
stack
和数组res
共使用 $O(N)$ 的额外空间。
图解以 Java 代码为例,Python 无需将
stack
转移至res
,而是直接返回倒序数组。
<,
,
,
,
,
,
,
>
代码:
[]class Solution: def reversePrint(self, head: ListNode) -> List[int]: stack = [] while head: stack.append(head.val) head = head.next return stack[::-1]
[]class Solution { public int[] reversePrint(ListNode head) { LinkedList<Integer> stack = new LinkedList<Integer>(); while(head != null) { stack.addLast(head.val); head = head.next; } int[] res = new int[stack.size()]; for(int i = 0; i < res.length; i++) res[i] = stack.removeLast(); return res; } }
统计信息
通过次数 | 提交次数 | AC比率 |
---|---|---|
332746 | 443676 | 75.0% |
提交历史
提交时间 | 提交结果 | 执行时间 | 内存消耗 | 语言 |
---|