解法有很多,作为初学者,看了很多大佬的解法,很多大佬都用了头插法,头插法自然可以,也直观,问题在于题目的考点不在于这里,如果是机试可能没问题,如果是面试的话,可能还是得揣摩面试官想问的点是什么。另外,ArrayList是基于动态数组的实现,既然是数组,对数组头插的时间复杂度较高,一定要头插的话,应该还是LinkedList比较好。


思路1:一种经典的思想是将链表的元素入栈,利用栈的先进后出的特点,来进行逆序,这么经典的栈的使用,很符合这个题目要考的知识点。利用空间换时间。而且也不存在递归调用的栈溢出的情况。

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> array = new ArrayList<Integer>();
        Stack<Integer> stack = new Stack<Integer>();
        //也可以求链表长度,然后创建等长度的Stack,和ArrayList。
        //毕竟ArrayList和stact是可以动态扩容的,更严谨的写法应该要加入求长度的过程。
         while(listNode != null){
             stack.push(listNode.val);
             listNode = listNode.next;
         }
        while(!stack.isEmpty()){
            array.add(stack.pop());
        }  
        return array;
    }
}

思路2:
头插法

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        ArrayList<Integer> list = new ArrayList<>();        
        while (listNode != null) {
            list.add(0,listNode.val);
            listNode = listNode.next;
        }
        return list;
    }
}