描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
如输入{1,2,3}的链表如下图:
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例1
输入:{1,2,3}
返回值:[3,2,1]
示例2
输入:{67,0,24,58}
返回值:[58,24,0,67]
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
// return printListFromTailToHeadI(listNode);
// return printListFromTailToHeadII(listNode);
return printListFromTailToHeadIII(listNode);
}
//方法三:利用栈,遍历链表时将节点值入栈,遍历结束后将栈中的元素不断出栈
//时间复杂度O(n),空间复杂度O(n)
private ArrayList<Integer> printListFromTailToHeadIII(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (listNode == null) {
return list;
}
Deque<Integer> stack = new LinkedList<>();
while (listNode != null) {
stack.push(listNode.val);
listNode = listNode.next;
}
while (!stack.isEmpty()) {
list.add(stack.pop());
}
return list;
}
//方法二:直接遍历
//时间复杂度O(n),空间复杂度O(n)
private ArrayList<Integer> printListFromTailToHeadII(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (listNode == null) {
return list;
}
while (listNode != null) {
list.add(0, listNode.val);
listNode = listNode.next;
}
return list;
}
//方法一:递归
//类似于二叉树的后序遍历,在递归后将节点的值添加至结果集
//时间复杂度O(n),空间复杂度O(n)
private ArrayList<Integer> printListFromTailToHeadI(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
if (listNode == null) {
return list;
}
helper(listNode, list);
return list;
}
private void helper(ListNode head, ArrayList<Integer> list) {
if (head == null) {
return;
}
helper(head.next, list);
list.add(head.val);
}
}