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

题目描述

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

答案

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

 

// 数组反转实现方式java

 

 

 

 
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能够理解成前一个节点地址,插入顺序:node

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

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

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

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

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

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
相关文章
相关标签/搜索