思路一
利用ArrayList的add(index, value)
方法,从头遍历链表,每次都把节点添加到list的0的位置。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> res = new ArrayList<Integer>();
ListNode temp = listNode;
while(temp != null) {
res.add(0, temp.val);
temp = temp.next;
}
return res;
}
}
思路二
采用递归
import java.util.ArrayList;
public class Solution {
private ArrayList<Integer> list = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode != null) {
printListFromTailToHead(listNode.next);
list.add(listNode.val);
}
return list;
}
}
但是递归方法在输入数据量过大时会发生栈溢出,无法通过。
思路三
利用栈,将链表的每个节点顺序压入栈中,弹栈的顺序就是从尾到头的顺序。
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list = new ArrayList<Integer>();
Stack<Integer> stack = new Stack<Integer>();
ListNode temp = listNode;
while(temp != null) {
stack.push(temp.val);
temp = temp.next;
}
while(!stack.empty()) {
list.add(stack.pop());
}
return list;
}
}