描述
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例
输入:head = [1,3,2]
输出:[2,3,1]
思路
这道题就是简单的逆序访问单链表节点,可以用递归在回溯的时候访问它,也可以自己定义一个辅助栈去存储访问过的节点数据。两种方法所用的辅助空间几乎相同,递归所需在栈中存储的信息更多,可能空间代价略高一些。
代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
// 递归法
class Solution {
List<Integer> list = new ArrayList<>();
public int[] reversePrint(ListNode head) {
recur(head);
int[] rst = new int[list.size()];
int i = 0;
for (int x : list) {
rst[i++] = x;
}
return rst;
}
private void recur(ListNode node) {
if (node == null) return;
recur(node.next);
list.add(node.val);
}
}
// 辅助栈
class Solution {
List<Integer> list = new ArrayList<>();
public int[] reversePrint(ListNode head) {
Stack<Integer> stack = new Stack<>();
ListNode cur = head;
while (cur != null) {
stack.push(cur.val);
cur = cur.next;
}
int[] rst = new int[stack.size()];
for (int i = 0; i < rst.length; i++) {
rst[i] = stack.pop();
}
return rst;
}
}