1.题目
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
如,输入:{67,0,24,58};输出:[58,24,0,67]
2.思路:
方法一:这种反向输出很容易想到了栈
import java.util.ArrayList; import java.util.*; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { Stack<ListNode> s=new Stack<>(); ArrayList<Integer> list=new ArrayList<>(); while(listNode!=null){//入栈 s.push(listNode); listNode=listNode.next; } while(!s.isEmpty()){//出栈 list.add(s.pop().val); } return list; } }
但是有人用ArrayList的特性,ArrayList 中有个方法是 add(index,value),可以指定 index 位置插入value值,所以我们在遍历 listNode 的同时将每个遇到的值插入到 list 的 0 位置,最后输出 listNode 即可得到逆序链表,这样代码更为简便
import java.util.ArrayList; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list=new ArrayList<>(); while(listNode!=null){ list.add(0,listNode.val); listNode=listNode.next; } return list; } }
方法二:利用递归的思想,递归到最后慢慢一层层输出也是一种逆序,因为其借用了计算机系统本身用栈存储的思想
import java.util.ArrayList; 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; } }