题目
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例 1:
输入:head = [1,3,2]
输出:[2,3,1]
限制:0 <= 链表长度 <= 10000
解题思路
1、遍历反转
从头到尾将链表打印到数组中,返回反转后的结果即可。
复杂度分析:
- 时间复杂度 O(N): 遍历链表,递归 N 次,遍历结果数组 N 次,反转结果数组 N 次,3N 约等于 N。
- 空间复杂度 O(N): 系统递归需要使用 O(N) 的栈空间,存储结果数组 要 O(N),生成的反序数组要 O(N),3N 约等于 N。
2、递归法
- 递推阶段: 每次传入 head.next ,以 head == null(即走过链表尾部节点)为递归终止条件,此时直接返回。
- 回溯阶段: 层层回溯时,将当前节点值加入列表,即tmp.add(head.val)。
- 最终,将列表 tmp 转化为数组 res ,并返回即可。
复杂度分析:
- 时间复杂度 O(N): 遍历链表,递归 N 次。
- 空间复杂度 O(N): 系统递归需要使用 O(N) 的栈空间。
实现
1、遍历反转
仅使用 int 型数组
class Solution {public int[] reversePrint(ListNode head) {// 判空if (head == null) {return new int[]{};}// 链表存储的正序 int 数字int[] nums = new int[10000];// 记录链表共有多少个结点int index = 0;// 遍历链表取出值放入 numswhile (head.next != null) {nums[index] = head.val;head = head.next;index++;}nums[index] = head.val;// 将 nums 的值倒序填入 resultint[] result = new int[index + 1];for (int i = 0; i <= index; i++) {result[i] = nums[index - i];}return result;}}

2、递归法
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);}}

