题目描述
输入一个链表,按链表从尾到头的顺序返回一个ArrayList。
我的思路
遍历列表,依次存入一个ArrayList中,然后再从后往前将其存入另一个ArrayList中
复杂度:
这样的方法时间复杂度O(n),空间复杂度O(n);
/**
* public class ListNode {
* int val;//该节点存储的数值
* ListNode next = null;//指向的下一个节点
*
* ListNode(int val) {
* this.val = val;//赋值
* }
* }
*
*/
import java.util.ArrayList;
//这里的listNode代表链表的第一个节点
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode == null){
return new ArrayList<Integer>();
}
ArrayList<Integer> arrayList = new ArrayList<Integer>();
while(listNode != null){
arrayList.add(listNode.val);
listNode = listNode.next;
}
ArrayList<Integer> newList = new ArrayList<Integer>();
for(int i = arrayList.size()-1;i>=0;i--){//获取大小是size();刚开始我写的是length()
newList.add(arrayList.get(i));
}
return newList;
}
}
剑指Offer提供的解法:
反转链表再打印,但需要像面试官询问能否改变链表的结构。如果不能改变,根据从后到前打印的特征,联想到栈的特点,使用栈来存储链表并输出(也可以每次到插入到arraylist的0位置)。既然栈可以,递归本质上也是一种栈结构,所以递归也可以实现。
栈存储:
/**
* 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) {
if(listNode == null){
return new ArrayList<Integer>();
}
Stack<Integer> stack = new Stack<Integer>();//注意栈的使用方法
ArrayList<Integer> arrayList = new ArrayList<Integer>();
while(listNode != null){
stack.push(listNode.val);
listNode = listNode.next;
}
while(!stack.isEmpty()){//判断是否为空的方法
arrayList.add(stack.pop());
}
return arrayList;
}
}
递归存储:虽然知道就是一直递归调用方法,然后直到最后一个节点,再依次从最后一个节点打印出来。但是不知道怎么递归。。。看了作者的代码才知道,就循环调用这个打印的方法体就好了printListFromTailToHead。
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
ArrayList<Integer> arrayList = new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode == null){
return new ArrayList<Integer>();
}
if(listNode.next != null){
printListFromTailToHead(listNode.next);
}
arrayList.add(listNode.val);
return arrayList;
}
}