第一种: 顺序遍历, 顺序添加, 反转

步骤:

  1. 依次遍历链表;
  2. 遍历时元素顺序添加到 ArrayList 中;
  3. 最后使用 Collections.reverse() 方法反转;
import java.util.ArrayList;
import java.util.Collections;
public class Solution
{
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode)
    {
        ArrayList<Integer> list = new ArrayList<>();
        while(listNode != null)
        {
            list.add(listNode.val);
            listNode = listNode.next;
        }
        Collections.reverse(list);
        return list;
    }
}

第二种: 干嘛不在插入时就保持逆序呢?

ArrayList 提供了两种插入单个元素的方式:

void add​(int index, E element)
Inserts the specified element at the specified position in this list.
在当前 list 的指定位置插入指定元素.
boolean add​(E e)
Appends the specified element to the end of this list.
在当前 list 的尾部添加指定元素.

可以看到 add() 本身可以具有逆序的功能, 只需要每次将新的元素添加到 list 头部即可.

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

第三种: 递归 (我这脑瓜是想不出来的, 看了大家的题解才知道的)

思想: 在遍历过程中,如果不是最后一个元素,则继续往下递归;否则,向 ArrayList 中添加元素,并向上返回 ArrayList.
值得注意的是, ArrayList 不能在方法内声明和定义. 需要定义一个全局变量 (对方法来说)

import java.util.ArrayList;
public class Solution {
    private final ArrayList<Integer> res = new ArrayList<>();
    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode != null)
        {
            printListFromTailToHead(listNode.next);
            res.add(listNode.val);
        }
        return res;
    }
}