剑指Offer | 从尾到头打印链表
题目描述
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
思路
递归:遍历链表,每次将val插入到list的第一个
非递归1:利用栈先入后出的思想,把链表推入栈,然后出栈
非递归2:参考反转链表,将链表反转之后依次输出
代码
1. 递归
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> res = new ArrayList<>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode != null) {
res.add(0,listNode.val);
printListFromTailToHead(listNode.next);
}
return res;
}
2. 非递归解法1——利用栈
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> s = new Stack<>();
while(listNode!=null) {
s.push(listNode.val);
listNode = listNode.next;
}
ArrayList<Integer> res = new ArrayList<>();
while(!s.isEmpty()) {
res.add(s.pop());
}
return res;
}
3. 非递归解法2——反转链表
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> res = new ArrayList<>();
ListNode pre = null;
while(listNode!=null) {
ListNode tmp = listNode.next;
listNode.next = pre;
pre = listNode;
listNode = tmp;
}
while(pre!=null) {
res.add(pre.val);
pre = pre.next;
}
return res;
}