题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
示例1
输入
{67,0,24,58}
返回值
[58,24,0,67]
解题思路
方法一:利用ArrayList.add(index,val),每次都把结果插入到第0个位置
方法二:直接进行递归-不通过
方法三:直接遍历,之后再将ArrayList进行反转
方法四:自己创建个栈,先把遍历结果存入栈中,最后再将栈内内容弹出放入ArrayList
方法五:先将链表进行反转,之后再遍历
Java代码实现
/** * public class ListNode { * int val; * ListNode next = null; * * ListNode(int val) { * this.val = val; * } * } * */ import java.util.*; public class Solution { //利用这个add的重载方法,但是本身就有复杂度 public ArrayList<Integer> printListFromTailToHead1(ListNode listNode) {//13ms 9620KB ArrayList<Integer> list=new ArrayList<>(); while(listNode != null){ list.add(0,listNode.val); listNode=listNode.next; } return list; } //利用系统的栈进行递归,直接不通过 public ArrayList<Integer> printListFromTailToHead2(ListNode listNode) { ArrayList<Integer> list=new ArrayList<>(); while(listNode != null){ printListFromTailToHead2(listNode.next); list.add(listNode.val); } return list; } //反转链表 public ArrayList<Integer> printListFromTailToHead3(ListNode listNode) {//11 ms 9608KB ArrayList<Integer> list=new ArrayList<>(); while(listNode != null){ list.add(listNode.val); listNode=listNode.next; } Collections.reverse(list);//直接反转链表 return list; } //利用栈遍历,最后再把栈弹出到列表 public ArrayList<Integer> printListFromTailToHead4(ListNode listNode) {//13 ms 9688KB ArrayList<Integer> list=new ArrayList<>(); Stack<Integer> stack=new Stack<>(); while(listNode != null){ stack.push(listNode.val); listNode=listNode.next; } while(!stack.empty()){ list.add(stack.pop()); } return list; } //先反转链表,再遍历存入list public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {//12 ms 9752KB ArrayList<Integer> list=new ArrayList<>(); ListNode pre=null; ListNode cur=listNode; ListNode temp=cur; while(cur != null){ temp=cur.next; cur.next=pre; pre=cur; cur=temp; } while(pre != null){ list.add(pre.val); pre=pre.next; } return list; } }