zoukankan      html  css  js  c++  java
  • 从尾到头打印链表


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


    解法一:最简单的想法,先排序,再逆序

    import java.util.ArrayList;
    import java.util.Collections;
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            ArrayList<Integer> integerList = new ArrayList<>();
     
            while (listNode != null) {
                integerList.add(listNode.val);
                listNode = listNode.next;
            }
            // 不想调用库函数也行,自己写一个叭
            Collections.reverse(integerList);
            return integerList;
        }
    }
    

    解法二:借助栈先进后出的原理,辅助实现逆序

    import java.util.Stack;
    import java.util.ArrayList;
    public class Solution {
        private Stack<Integer> stack = new Stack<>();
        private ArrayList<Integer> list = new ArrayList<>();
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            while(listNode != null) {
                stack.push(listNode.val);
                listNode = listNode.next;
            }
            while(stack.size() > 0) {
                list.add(stack.pop());
            }
            return list;
        }
    }
    

    解法三:使用递归思想,递归其实也类似于栈的调用

    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;
        }
    }
    

    解法四:使用头插法实现

    对于 ArrayList 来说,数组元素移动的开销太大,不建议使用,但思路是不错的

    public class Solution {
        private ArrayList<Integer> list = new ArrayList<>();
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            while(listNode != null) {
                list.add(0, listNode.val);
                listNode = listNode.next;
            }
            return list;
        }
    }
    

    小结:涉及到逆序问题,可以往以下方面考虑

    • 借助栈先进后出的特点
    • 递归也可以实现栈的作用
    • 头插法是把新结点插入首部,其余结点往后退,也是一个值得考虑的方案

  • 相关阅读:
    [置顶] 搭建一个流媒体服务器引子
    Exchange Server 2007 常见问题解答(6)
    [置顶] 第九周项目1
    iOS 6应用开发实战
    hdu 1722(数论)
    js二维数组排序
    HDU 4027 线段树 Can you answer these queries?
    Socket编程指南及示例程序
    Spring攻略学习笔记(2.13)解析文本消息
    线性渐变lineargradient和滤镜opacity/filter的透明效果兼容性解决方案及其RGB/RGBA与16进制转换方法
  • 原文地址:https://www.cnblogs.com/Yee-Q/p/13658458.html
Copyright © 2011-2022 走看看