思路
M1-栈
栈的特点是先入后出,所以可以遍历节点并且入栈。然后挨个弹出栈顶节点,并将节点添加到List集合中进行返回。
M2-递归
递归法的特点就是递归到尾节点,然后首先将尾节点添加到list中,然后将其list返回,然后通过引用传递的方式,每次递归都会返回一个list引用,就做到了从最后进行返回(例如:[3] -> [3,2] -> [3,2,1]),最终将最终引用返回给调用者,也就实现了反转打印。

结果
M1->运行时间:47ms 占用内存:10560KB
M2->运行时间:45ms 占用内存:10816KB

代码-M1

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
    if (listNode == null) return new ArrayList<Integer>();
        if (listNode.next == null) return new ArrayList<Integer>(listNode.val);

        // 解决方法一:栈特性,先进后出
        Stack<Integer> stack = new Stack<>();
        ListNode currentNode = listNode;
        // 入栈
        while (currentNode != null){
            stack.push(currentNode.val);
            currentNode = currentNode.next;
        }

        // 出栈
        ArrayList<Integer> list = new ArrayList<>();
        while (!stack.isEmpty()){
            list.add(stack.pop());
        }

        return list;
}

代码-M2

public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        // 解决方法二:递归
        // 如果当前节点为null
        if (listNode == null) return new ArrayList<>();

        while (true){
            // 构造集合
            ArrayList<Integer> list = new ArrayList<>();
            // 如果当前节点为null,那么直接continue

            // 如果当前节点不是最后一个节点,那么就向下递归寻找,获取后续反转数据集合
            if (listNode.next != null){
                list = printListFromTailToHead(listNode.next);
            }
            // 向此节点后已经反转好的集合中添加该节点的值
            list.add(listNode.val);

            return list;
        }
}