题目形容
输入一个链表,按链表值从尾到头的顺序返回一个ArrayList
题解
/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.util.ArrayList;import java.util.Stack;public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list = new ArrayList<>(); if (listNode == null) return list; Stack<ListNode> stack = new Stack<>(); while (listNode != null) { stack.push(listNode); listNode = listNode.next; } while (!stack.isEmpty()) { list.add(stack.pop().val); } return list; }}
上面用的是栈的思想,也即通过正向遍历链表,把链表的结点存放到栈的结构中,而后取出的时候通过栈的pop()方法,这样通过再从栈中取出,就成了先入栈的后出栈,导致把链表的次序给反转了。
第二种方式 递归
首先递归也相似于一种从尾到头的排序,即我们不断进入递归,一层层的往下寻觅,不断加大了深度,当到了递归的限定条件时,开始把元素增加进入list。这个时候就是利用递归从最里面往外的特性。
/*** public class ListNode {* int val;* ListNode next = null;** ListNode(int val) {* this.val = val;* }* }**/import java.util.ArrayList;import java.util.Stack;public class Solution { ArrayList<Integer> list = new ArrayList<>(); public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { if(listNode!=null) { printListFromTailToHead(listNode.next); list.add(listNode.val); } return list; }}