zoukankan      html  css  js  c++  java
  • 剑指Offer编程题(Java实现)——从尾到头打印链表

    题目描述

    输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。

    解题思路

    思路一:使用头插法

    使用头插法可以得到一个逆序的链表。遍历链表,每次将所遍历节点插入到链表的头部。

    头结点和第一个节点的区别:

    • 头结点是在头插法中使用的一个额外节点,这个节点不存储值;
    • 第一个节点就是链表的第一个真正存储值的节点。
    /**
    *    public class ListNode {
    *        int val;
    *        ListNode next = null;
    *
    *        ListNode(int val) {
    *            this.val = val;
    *        }
    *    }
    *
    */
    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            ArrayList<Integer> res = new ArrayList<Integer>();
            if(listNode == null) return res;
            ListNode newList = new ListNode(-1);
            while(listNode != null){
                ListNode tmp = listNode.next;
                listNode.next = newList.next;
                newList.next = listNode;
                listNode = tmp;
            }
            while(newList.next != null){
                res.add(newList.next.val);
                newList = newList.next;
            }
            return res;
        }
    }

    运行结果:

    运行时间:17ms

    占用内存:9324k

    类似做法:遍历链表,创建一个新的链表,每次将遍历的节点放在开头

    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            ArrayList<Integer> res = new ArrayList<Integer>();
            if(listNode == null) return res;
            ListNode newList = new ListNode(listNode.val);
            ListNode nextNode = listNode.next;
            while(nextNode != null){
                ListNode insert = new ListNode(nextNode.val);
                insert.next = newList;
                newList = insert;
                nextNode = nextNode.next;
            }
            res.add(newList.val);
            nextNode = newList.next;
            while(nextNode != null){
                res.add(nextNode.val);
                nextNode = nextNode.next;
            }
            return res;
        }
    }

    结果:

    运行时间:21ms

    占用内存:9412k

    思路二:递归

    /**
    *    public class ListNode {
    *        int val;
    *        ListNode next = null;
    *
    *        ListNode(int val) {
    *            this.val = val;
    *        }
    *    }
    *
    */
    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            // 递归
            ArrayList<Integer> res = new ArrayList<Integer>();
            if(listNode != null){
                res.addAll(printListFromTailToHead(listNode.next));
                res.add(listNode.val);
            }
            return res;
        }
    }

    结果:

    运行时间:19ms

    占用内存:9436k

    思路三:栈

    /**
    *    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) {
            //
            Stack<Integer> stk = new Stack<Integer>();
            while(listNode != null){
                stk.add(listNode.val);
                listNode = listNode.next;
            }
            ArrayList<Integer> res = new ArrayList<Integer>();
            while(!stk.isEmpty()){
                res.add(stk.pop());
            }
            return res;
        }
    }

    结果:

    运行时间:22ms

    占用内存:9424k

    思路参考:https://www.nowcoder.com/discuss/198840

  • 相关阅读:
    机器学习python实战----决策树
    机器学习python实战----手写数字识别
    机器学习python实战----k近邻算法
    斯坦福2014机器学习笔记八----机器学习系统的设计
    斯坦福2014机器学习笔记七----应用机器学习的建议
    斯坦福2014机器学习笔记六----神经网络(二)
    Global Game Jam 2019 深圳站 个人总结
    加法乘法线段树模板
    线段树模板题
    单调栈和单调队列入门
  • 原文地址:https://www.cnblogs.com/MWCloud/p/11312763.html
Copyright © 2011-2022 走看看