鏈表數據結構圖解 和 代碼實現


項目中經常會用到LinkedList集合來存儲數據,打算寫一篇LinkedList的源碼解析,而LinkedList是基於鏈表結構存儲數據的,這篇博文將解析鏈表數據結構,包括單向鏈表和雙向鏈表;

1:單向鏈表:

單向鏈表的鏈表對象維護了一個 first 引用,該引用指向節點鏈表中的第一個節點對象,每個節點對象維護一個 next 引用,next引用指向下一個節點對象;(這里注意:是引用指向的是節點對象:節點對象包含存儲的數據和next引用)

以下是單向鏈表的圖解:

java代碼實現如下:

public class LinkedListDemo1 { //表示整個鏈表對象

    private Node first;        //鏈表對象的第一個引用
    
    public LinkedListDemo1(){
        
    }
    
    
    public Node getFirst() {
        return first;
    }


    public void setFirst(Node first) {
        this.first = first;
    }


    class Node{              //節點對象
         Item item;          //存儲的數據對象
         Node next;          //下一個節點對象的引用
        public Item getItem() {
            return item;
        }
        public void setItem(Item item) {
            this.item = item;
        }
        public Node getNext() {
            return next;
        }
        public void setNext(Node next) {
            this.next = next;
        }
        
        
    }
}

當需要在首位置插入元素時,圖解如下:first 引用指向需要插入到鏈表中的節點對象,新的節點對象的next引用指向原先的首節點對象;

java代碼實現如下:

//插入對象到鏈表首位置
	public void insertFirst(Item item){
		//創建鏈表對象
		LinkedListDemo1 list=new LinkedListDemo1();
		//原來的首個節點暫存在:用oldFirst引用指向
		Node oldFirst=first;
		//創建需要插入的節點對象
		Node newNode=new Node();
		newNode.item=item;
		//新節點對象的next引用指向原先的首節點對象
		newNode.next=oldFirst;
		
	}

 當然這里的插入沒有考慮首位置的節點對象為null的情況,插入到其他位置的節點實現原理和插入到首位置的基本差不多;

下面接收雙向鏈表的實現原理:

鏈表對象中維護一個first 引用和 last引用,分別指向鏈表中的首末節點對象;每個節點對象維護 存儲的數據對象引用,prev和next引用,用來指向前后節點對象;

雙向鏈表的圖解:

java代碼實現鏈表對象如下:

public class LinkedListDemo2 {

	private Node first;
	private Node last;
	
	
	public LinkedListDemo2(){
		
	}
	
	
	public Node getFirst() {
		return first;
	}


	public void setFirst(Node first) {
		this.first = first;
	}
	
	


	public Node getLast() {
		return last;
	}


	public void setLast(Node last) {
		this.last = last;
	}




	class Node{
		 Item item;
		 Node prev;
		 Node next;
		public Item getItem() {
			return item;
		}
		public void setItem(Item item) {
			this.item = item;
		}
		
		public Node getPrev() {
			return prev;
		}
		public void setPrev(Node prev) {
			this.prev = prev;
		}
		public Node getNext() {
			return next;
		}
		public void setNext(Node next) {
			this.next = next;
		}

}
}

雙向鏈表插入元素到首位:

圖解:

java代碼實現:

public void insertFirst(Item item){
		//暫存原先首節點對象
		Node oldFirst=first;
		//創建新的節點對象
		Node newNode=new Node();
		newNode.item=item;
		newNode.next=first;
		//first引用指向新節點對象
		first=newNode;
		//原先的節點對象的prev引用指向新節點對象
		oldFirst.prev=newNode;
	}

到此,單向鏈表結構和雙向鏈表結構就解析完了,下一篇博客中將解析 LinkedList 的源碼;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM