1. 程式人生 > >java【LinkedList底層實現】

java【LinkedList底層實現】

雙向連結串列(雙鏈表)是連結串列的一種。和單鏈表一樣,雙鏈表也是由節點組成,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向連結串列中的任意一個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。一般我們都構造雙向迴圈連結串列。

雙向迴圈連結串列

下面程式碼中,不是雙向迴圈連結串列,而是雙向連結串列,但是頭節點和尾節點沒有連線起來。

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 歡迎交流