题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
示例1
输入
{67,0,24,58}
返回值
[58,24,0,67]
解题思路
方法一:利用ArrayList.add(index,val),每次都把结果插入到第0个位置
方法二:直接进行递归-不通过
方法三:直接遍历,之后再将ArrayList进行反转
方法四:自己创建个栈,先把遍历结果存入栈中,最后再将栈内内容弹出放入ArrayList
方法五:先将链表进行反转,之后再遍历

Java代码实现

/**
*    public class ListNode {
*        int val;
*        ListNode next = null;
*
*        ListNode(int val) {
*            this.val = val;
*        }
*    }
*
*/
import java.util.*;
public class Solution {
    //利用这个add的重载方法,但是本身就有复杂度
    public ArrayList<Integer> printListFromTailToHead1(ListNode listNode) {//13ms  9620KB 
        ArrayList<Integer> list=new ArrayList<>();
        while(listNode != null){
            list.add(0,listNode.val);
            listNode=listNode.next;
        }
        return list;
    }
    //利用系统的栈进行递归,直接不通过
    public ArrayList<Integer> printListFromTailToHead2(ListNode listNode) {
        ArrayList<Integer> list=new ArrayList<>();
        while(listNode != null){
            printListFromTailToHead2(listNode.next);
            list.add(listNode.val);
        }
        return list;
    }
    //反转链表
    public ArrayList<Integer> printListFromTailToHead3(ListNode listNode) {//11 ms 9608KB 
        ArrayList<Integer> list=new ArrayList<>();
        while(listNode != null){
            list.add(listNode.val);
            listNode=listNode.next;
        }
        Collections.reverse(list);//直接反转链表
        return list;
    }
    //利用栈遍历,最后再把栈弹出到列表
    public ArrayList<Integer> printListFromTailToHead4(ListNode listNode) {//13 ms 9688KB 
        ArrayList<Integer> list=new ArrayList<>();
        Stack<Integer> stack=new Stack<>();
        while(listNode != null){
            stack.push(listNode.val);
            listNode=listNode.next;
        }
        while(!stack.empty()){
            list.add(stack.pop());
        }
        return list;
    }
    //先反转链表,再遍历存入list
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {//12 ms 9752KB 
        ArrayList<Integer> list=new ArrayList<>();
        ListNode pre=null;
        ListNode cur=listNode;
        ListNode temp=cur;
        while(cur != null){
            temp=cur.next;
            cur.next=pre;
            pre=cur;
            cur=temp;
        }
        while(pre != null){
            list.add(pre.val);
            pre=pre.next;
        }
        return list;
    }
}