劍指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
相關文章
相關標籤/搜索