剑指offer:从尾到头打印链表

来源:互联网 发布:计算机应用与软件投稿 编辑:程序博客网 时间:2024/05/13 08:26

题目描述

输入一个链表,从尾到头打印链表每个节点的值。

方法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);    }}


原创粉丝点击