鏈表:一種數據存儲結構.學鏈表首先要搞懂數組,按朋友的話說,數組和鏈表的關系就相當於QQ2008和QQ2009. 除非要通過索引頻繁訪問各個數據,不然大多數情況下都可以用鏈表代替數組.
鏈表部分主要要涉及:單鏈表,雙端鏈表,有序鏈表,雙向鏈表和有迭代器的鏈表(迭代器是用來隨機訪問鏈表元素的一種方法). 由於以前貪玩數據結構沒上課,現在后悔所以要努力補上.
鏈結點: 在鏈表中,每個數據項都被包含在"鏈結點"(Link)中.一個鏈結點是某個類的對象,這個類可以叫Link.而每個Link對象中又包含着一個對下一個鏈結點引用的字段(通常叫next).但是鏈表(LinkList)本身的對象中有一個字段(first)指向第一個鏈結點的引用.看圖會清晰些.
這張表體現在代碼里就兩個構造類: Link(鏈結點類)
代碼大框如下:
鏈結點: 在鏈表中,每個數據項都被包含在"鏈結點"(Link)中.一個鏈結點是某個類的對象,這個類可以叫Link.而每個Link對象中又包含着一個對下一個鏈結點引用的字段(通常叫next).但是鏈表(LinkList)本身的對象中有一個字段(first)指向第一個鏈結點的引用.看圖會清晰些.

class Link { public int iData; public double dData; public Link next; // 這個next就是鏈結點對象對下個鏈接點的引用.默認初始化為NULL public Link(int id, double dd){ iData = id; dData = dd; } }
LinkList(鏈表類)
class LinkList { public Link first; // 首鏈結點first,初始化為NULL public LinkList () { first = null; } }
就這樣一個鏈結點指向下個鏈結點的引用構成了整個鏈表. 今天這個實例,顯示了一個單鏈表.主要的操作如下:
在鏈表頭插入一個數據項. 在鏈表頭刪除一個數據項. 遍歷鏈表顯示內容. 首先插入一個鏈接點的邏輯就是:將first的引用指向Link對象鏈結點的next引用,然后再將first指向這個鏈結點就構造了新的鏈表.如圖

代碼大框如下:
public void insertFirst(int id, double dd) { Link newLink = new Link(id, dd); // 構造新的鏈結點對象 newLink.next = first; // 將鏈結點對象的next指向first的引用 first = newLink; // 然后將first指向newLink對象 }
刪除一個鏈結點的邏輯就是
:用一個臨時變量存儲first的引用(即要刪除的鏈結點)然后將first指向first.next(即他只想的鏈結點對象的next指向的那個鏈結點Link).這樣要刪除的那個鏈結點就沒有了指針對他的引用.Java垃圾回收就會把他收回.實現了並返回存儲的那個刪除節點.如圖
代碼大框如下:

public Link deleteFirst() { Link temp = first; // 暫存first引用的這個鏈結點(即要刪除的) first = first.next;// 將first指向他所引用的Link鏈接點的next引用 return temp; // 返回要刪除的鏈結點 }
這要弄清了,Java對象引用的關系理解起來就很容易了.下面就是實現的整個代碼:

打印的結果為:
List: (first ---> last){88,88.88}{66,66.88}{44,44.88}{22,22.88} {88,88.88} Deleted {66,66.88} Deleted {44,44.88} Deleted {22,22.88} Deleted List: (first ---> last)
繼續擴展下添加查找對應鍵值和按對應鍵值刪除鏈結點的find和delete方法.
find方法: 這個方法與上面的displayLink方法類似.將current定義為first,通過不斷的current.next.iData與鍵值作比較,如果相等便返回當前引用. 如果一直到最后Null也沒找到就返回Null delete方法: 這個方法需要兩個變量.current:當前鏈結點的引用 privious:前一鏈結點的引用.這個方法也是通過循環查找如果找到了 .就用前一引用的next指向當前的next的引用就可以了.見圖 最后代碼:

執行結果:
List: (first ---> last){88,88.88}{66,66.88}{44,44.88}{22,22.88} the Find Item: {22,22.88} the Del Item: {22,22.88} List: (first ---> last){88,88.88}{66,66.88}{44,44.88}