原题链接:从尾到头打印链表_牛客题霸_牛客网
题目
描述
输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。
返回一个数组为[3,2,1]
0 <= 链表长度 <= 10000
示例1
输入:
{1,2,3}
返回值:
[3,2,1]
第一种方法:栈
思路
因为栈是后进先出,所以刚好可以反转链表
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack = new Stack<>();
ArrayList<Integer> al = new ArrayList<>();
while(listNode != null){
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.isEmpty()){
al.add(stack.pop());
}
return al;
}
}
第二种方法:暴力遍历法
思路
因为add可以指定插入位置所以,我们可以选择遍历头插
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> al = new ArrayList<>();
ListNode head = listNode;
while(head != null){
al.add(0,head.val);
head = head.next;
}
return al;
}
}
第三种方法:递归尾差
思路
既然我们可以直接从头开始遍历头插,那我们也可以使用递归进行尾差
使用递归遍历到最后一个val,用add插入之后返回
public class Solution {
ArrayList<Integer> al = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode == null){
return al;
}
printListFromTailToHead(listNode.next);
al.add(listNode.val);
return al;
}
}