题目描述
输入一个链表,从尾到头打印链表每个节点的值。
方法1:用栈作为临时变量存储
【运行时间:16ms 占用内存:8220k】
思路:遍历链表,依次做压栈操作。最后从栈尾依次取数据放入list中。
/**
* public class ListNode {
* int val;
* ListNode next = null;
*
* ListNode(int val) {
* this.val = val;
* }
* }
*
*/
/*
public class Solution {
ArrayList<Integer> arrayList=new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
this.printListFromTailToHead(listNode.next);
arrayList.add(listNode.val);
}
return arrayList;
}
}
*/
import java.util.*;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
Stack<Integer> stack=new Stack<Integer>();
while(listNode!=null){
stack.push(listNode.val);
listNode=listNode.next;
}
ArrayList<Integer> list=new ArrayList<Integer>();
while(!stack.isEmpty()){
list.add(stack.pop());
}
return list;
}
}
方法2:用两个ArrayList
【运行时间:16ms 占用内存:7716k】
import java.util.*;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> list=new ArrayList<Integer>();//最终输出的list
ArrayList<Integer> listTemp=new ArrayList<Integer>();//中间变量,
while(listNode!=null){
listTemp.add(listNode.val);
listNode=listNode.next;
}
//将listTemp从尾部取出放入list中
for(int i=listTemp.size()-1;i>=0;i--){
list.add(listTemp.get(i));
}
return list;
}
}
方法3:用递归来实现
【运行时间:21ms 占用内存:8264k】
此方法参考牛客网牛油解答,递归的效率貌似不怎么高。
import java.util.ArrayList;
public class Solution {
//将 ArrayList作为全局变量来操作
ArrayList<Integer> arrayList=new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
if(listNode!=null){
printListFromTailToHead(listNode.next);
arrayList.add(listNode.val);
}
return arrayList;
}
}
方法4:用Collections类的reverse方法
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> arrayList=new ArrayList<Integer>();
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
while(listNode!=null){
arrayList.add(listNode.val);
listNode=listNode.next;
}
Collections.reverse(arrayList);
return arrayList;
}
}
方法5:递归2
【运行时间:13ms 占用内存:8404k】
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
ArrayList<Integer> arrayList=new ArrayList<Integer>();
if(listNode==null) return arrayList;
getReverse(listNode,arrayList);
return arrayList;
}
public void getReverse(ListNode node, ArrayList<Integer> list){
if(node==null) return;
getReverse(node.next,list);
list.add(node.val);
}
}