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