题目描述
输入一个链表,按链表值从尾到头的顺序返回一个 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); }}测试用例
功能测试(输入的链表有多个结点;输入的链表只有一个结点);
特殊输入测试(输入的链表结点指针为空)。