• 剑指Offer_编程题_从尾到头打印链表


    题目描述

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

    答案

    有三种思路,
    第一就是利用栈先入后出的特性完成,
    第二就是存下来然后进行数组翻转。
    第三是利用递归。

    // 数组反转实现方式

     
     
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            ArrayList<Integer> list=new ArrayList<Integer>();
            ListNode pre=null;
            ListNode next=null;
            while(listNode!=null){
                next=listNode.next;
                listNode.next=pre;
                pre=listNode;
                listNode=next;
            }
            while(pre!=null){
                list.add(pre.val);
                pre=pre.next;
            }
            return list;
        }
    }
     
     
    链接:https://www.nowcoder.com/questionTerminal/d0267f7f55b3412ba93bd35cfa8e8035?f=discussion
    来源:牛客网

    java 递归超简洁版本
    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;
        }
    }  
     

    创建链表相关,头插法和尾插法

      

     关于头插法,可以next可以理解成前一个节点地址,插入顺序:

    1、头节点传入,开始创建A数据,头节点的next指向A数据的内存地址,A节点的next替换成头节点的

    2、头节点再传入,创建B数据,头节点的next又换成了指向B的内存地址,B节点的next替换头节点的A;

    总结一下:插入时候,一直在头节点的上面插入数据,原来的数据被“顶”上去了;

         头插法遍历的时候,头节点开始,一个一个往上遍历。这样最后插入的就作为第一个输出出来了;

         尾插法编练插入,比较好理解,就是一直在“尾巴”追加,遍历时候从头开始,第一个插入的就第一个输出出来; 

    public class Test {

    static Node headNode;

    class Node {
    private Node next;//指针
    private int data;//数据域
    }

    //尾插法创建单链表 队列形式先进先出
    public void back(Node node, int data) {
    if (data < 10) {
    Node next = new Node();
    next.data = data;
    next.next = null;
    node.next = next;
    back(next, ++data);
    }
    }

    //头插法创建单链表 栈形式先进后出
    public void head(Node node, int data) {

    if (data < 10) {
    Node next = new Node();
    next.next = node.next;


    next.data = data;
    node.next = next;
    System.out.println("递归参数:" + node.data);
    head(node, ++data);
    }
    }

    public static void main(String[] args) {
    Test test = new Test();
    headNode = test.new Node();//头指针
    // new Test().back(headNode, 0);//前插法
    new Test().head(headNode, 0);//后插法
    System.out.println("创建后的链表是:");//0 1 2 3 4 5 6 7 8 9 10
    while (headNode.next != null) {
    headNode = headNode.next;
    System.out.print(headNode.data + " ");
    }
    }

    }

    //————————————————
    //版权声明:本文为CSDN博主「另一个绝影」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    //原文链接:https://blog.csdn.net/weixin_37817685/article/details/83305972
  • 相关阅读:
    模块化利器:RequireJS常用知识
    移动端适配:font-size设置的思考
    样式化复选框
    jquery tmpl 详解
    移动前端相关解决方案整理
    常用页面布局方式介绍
    移动端制作的常见问题及解决方法
    手机端页面自适应:rem布局
    React工程化之PWA之serviceWorker
    React之JSX循环遍历方法对比
  • 原文地址:https://www.cnblogs.com/liran123/p/12641478.html
Copyright © 2020-2023  润新知