項目中經常會用到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 的源碼;