题目描述
输入一个链表,按链表从尾到头的顺序返回一个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;
}
}
京公网安备 11010502036488号