1.單鏈表的乙個優點是結構簡單,但是它也有乙個缺點,即在單鏈表中只能通過乙個結點的引用訪問其後續結點,而無法直接訪問其前驅結點,要在單鏈表中找到某個結點的前驅結
點,必須從鍊錶的首結點出發依次向後尋
找,但是需要ο
(n)時間
。為此我們可以擴充套件單鏈表的結點結構,使得通過乙個結點的引用,不但能夠訪問其後續結點,也可以方便的訪問其前驅結點。擴充套件單鏈表結點結構的方法是,在單鏈表結點結構中新增加乙個域,該域用於指
向結點的直接前驅結點。擴充套件後的結點結構是構成雙向鍊錶的結點結構。在
雙向鍊錶中進行查詢與在單鏈表中類似,只不過在雙向鍊錶中查詢操作可以從鍊錶的首結點開始,也可以從尾
結點開始,但是需要的時間和在單鏈表中一樣。
單鏈表的插入操作,除了首結點之外必須在某個結點的後面進行,而在雙向鍊錶中,在乙個已知的結點之前或之後都可以。
單鏈表的刪除操作,除了首結點之外必須在知道待刪結點的前驅結點的基礎上才能進行,而在雙向鍊錶中在已知某個結點引用的前提下,可以完成該結點自身的刪除。
在具有頭尾結點的雙向鍊錶中插入和刪除結點,無論插入和刪除的結點位置在何處,因為首尾結點的存在,插入、刪除操作都可以被歸結為上圖介紹的在雙向鍊錶某個中間結點的插入和刪除;並且因為首尾結點的存在,整個鍊錶永遠不會為空,因此在插入和刪
除結點之後,也不用考慮鍊錶由空變為非空或由非空變為空的情況下
head
和 tail
的指向問
題;從而簡化了程式。
雙向鍊錶的缺點是每次插入或刪除乙個結點的時候,要處理四個鏈結點的引用,而不是兩個;兩個連線前乙個乙個鏈結點,兩個連線後乙個鏈結點。當然由於多了兩個引用,鏈結點的占用空間也大了一些。
public class doublelink
public boolean isempty()
public void insertfirst(int data)
public void insertlast(int data)
public boolean insertafter(int key, int idata)
link link = new link(idata);
if (current == last) else
link.prev = current;
current.next = link;
return true;
} public link deletekey(int key)
first = current.next;
if (current == last)
last = current.prev;
else
current.next.prev = current.prev;
return current;
} public link deletefirst()
public link deletelast()
public void showfirst()
} public void showlast()
} public static void main(string args)
}class link
public void show()
}
雙向鍊錶的簡單實現
雙向鍊錶的特點是 第乙個元素的 prev 是none 1 雙向鍊錶 2class node 3def init self,node none,prev none,next none 4 注意順序,因為例項化,一般不會關鍵字傳參,如果node none 1 1 是給node形參的,如果形參列表不同,則...
雙向迴圈鍊錶的簡單操作
最近看了linux核心 list.h發現大部分都是鍊錶的一些操作,所以就把雙向迴圈鍊錶的一些簡單操作寫了寫,結果發現什麼東西還是要經常練,不然就生疏了 主要實現了雙向鍊錶的增 刪 改 查 排序 及雙向遍歷。原始碼如下 include include include include typedef s...
雙向鍊錶的簡單操作(Java)
定義乙個鍊錶標準介面 inte ce linklist 提供資料 節點間的關係 具體操作 class linklistdo implements linklist 鍊錶的相關操作 增加鍊錶結點,返回是否成功 public boolean add object data else 鍊錶長度 1 thi...