题目描述
输入一个链表,按链表值从尾到头的顺序返回一个 ArrayList
。
解法
解法一【推荐】
遍历链表,每个链表结点值 push
进栈,最后将栈中元素依次 pop
到 list
中。
/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/ import java.util.ArrayList; import java.util.Stack; /** * @author bingo * @since 2018/10/28 */ public class Solution { /** * 从尾到头打印链表 * @param listNode 链表头节点 * @return list */ public ArrayList < Integer > printListFromTailToHead(ListNode listNode) { ArrayList < Integer > res = new ArrayList < >(); if (listNode == null) { return res; } Stack < Integer > stack = new Stack < >(); while (listNode != null) { stack.push(listNode.val); listNode = listNode.next; } while (!stack.isEmpty()) { res.add(stack.pop()); } return res; } }
解法二【不推荐】
利用递归方式:
若不是链表尾结点,继续递归;
若是,添加到
list
中。
这种方式不推荐,当递归层数过多时,容易发生 Stack Overflow
。
/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/ import java.util.ArrayList; import java.util.Stack; /** * @author bingo * @since 2018/10/28 */ public class Solution { /** * 从尾到头打印链表 * @param listNode 链表头结点 * @return list */ public ArrayList < Integer > printListFromTailToHead(ListNode listNode) { ArrayList < Integer > res = new ArrayList < >(); if (listNode == null) { return res; } addElement(listNode, res); return res; } private void addElement(ListNode listNode, ArrayList < Integer > res) { if (listNode.next != null) { // 递归调用 addElement(listNode.next, res); } res.add(listNode.val); }}
测试用例
功能测试(输入的链表有多个结点;输入的链表只有一个结点);
特殊输入测试(输入的链表结点指针为空)。