java【LinkedList底層實現】
阿新 • • 發佈:2018-12-18
雙向連結串列(雙鏈表)是連結串列的一種。和單鏈表一樣,雙鏈表也是由節點組成,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈連結串列。
下面程式碼中,不是雙向迴圈連結串列,而是雙向連結串列,但是頭節點和尾節點沒有連線起來。
package com.bjsxt.collection; import java.util.ArrayList; public class MyLinkedList { //和以前定義陣列一樣 private Node first; private Node last; int size=0;//連結串列裡面有幾個節點了 void add(Node e){ final Node l=last;//不能被改變 //如果last不為空 if(last!=null){ //設定e的字首為last的字首 e.setProvide(l); //設定last的字尾為空 e.setNext(null); //設定e的字尾為last last.setNext(e); last=e; if(first.next==null){ first.setNext(e); } //如果last為空 }else{ first=e; last=e; } size++; } //實現遍歷功能 void whileLinkedList(){ Node mm=first; System.out.print("前置節點"+first.provide); System.out.print("自身節點"+first.self); System.out.print("後置節點"+first.next.self); System.out.println("========================"); for(int i=0;i<size-1;i++){ Node x=mm.next; if(x!=null){ if(x.provide!=null){ System.out.print("前置節點"+x.provide.self); } if(x.self!=null){ System.out.print("自身節點"+x.self); } if(x.next!=null){ System.out.print("後置節點"+x.next.self); } } if(i==size-2){ System.out.print("後置節點"+null); } System.out.println("========================"); mm=x; } } public static void main(String[] args){ MyLinkedList myLinkedList =new MyLinkedList(); for(int i=0;i<200;i++){ myLinkedList.add(new Node(i)); } System.out.println("現在佇列裡面有"+myLinkedList.size+"節點"); System.out.println("第一個節點"+myLinkedList.first.self); System.out.println("最後一個節點"+myLinkedList.last.self); myLinkedList.whileLinkedList(); } } //節點,相當於我們集合裡存放的一個個單元 //它本身有三個元素 即前驅 後記 及它本身 為了方便我們將self也定義為String,其實他也可以是Object的任意元素 class Node{ Node provide; Object self; Node next; public Node getProvide() { return provide; } public void setProvide(Node provide) { this.provide = provide; } public Object getSelf() { return self; } public void setSelf(Object self) { this.self = self; } public Node getNext() { return next; } public void setNext(Node next) { this.next = next; } public Node(Node provide, Object self, Node next) { super(); this.provide = provide; this.self = self; this.next = next; } public Node() { super(); } public Node(Object self) { super(); this.self = self; } }
輸出結果如下:
現在佇列裡面有12節點 第一個節點0 最後一個節點11 前置節點null自身節點0後置節點1======================== 前置節點0自身節點1後置節點2======================== 前置節點1自身節點2後置節點3======================== 前置節點2自身節點3後置節點4======================== 前置節點3自身節點4後置節點5======================== 前置節點4自身節點5後置節點6======================== 前置節點5自身節點6後置節點7======================== 前置節點6自身節點7後置節點8======================== 前置節點7自身節點8後置節點9======================== 前置節點8自身節點9後置節點10======================== 前置節點9自身節點10後置節點11======================== 前置節點10自身節點11後置節點null========================
結束語:看起來簡單,做起來難,不要做眼高手低的人
v:18612372242 歡迎交流