平時我們使用最多的資料結構應該是陣列,很多東西都可以用陣列來輕鬆實現,但在某些程式語言中,陣列的長度是預先設定好的,想要額外新增元素或者刪除元素是一件比較困難的事。那麼使用鍊錶的話恰恰就解決了這些問題,對於鍊錶來說刪除或新增乙個元素是非常方便的,除了資料的隨機訪問(可以實現但是比較麻煩,比如可以通過新增和操作索引值來實現),它幾乎可以用在任何可以使用一維陣列的情況中。
鍊錶的定義
鍊錶是由一組節點組成的集合。每個節點都使用乙個物件的引用指向它的後繼。指向另一
個節點的引用叫做鏈。
一般的鍊錶都會額外新增乙個頭節點(作為輔助)和尾節點,例如下面這種樣子
陣列元素靠它們的位置進行引用,鍊錶元素則是靠相互之間的關係進行引用。在上圖中,我們說 bread 跟在 milk 後面,而不說 bread 是鍊錶中的第二個元素。遍歷鍊錶,就是跟著鏈結,從鍊錶的首元素一直走到尾元(但這不包含鍊錶的頭節點,頭節點常常用來作為鍊錶的接入點)。上圖中另外乙個值得注意的地方是,鍊錶的尾元素指向乙個 null 節點。
插入新元素:
向單向鍊錶中插入乙個節點,只需要修改它前面的節點(前驅),使其指向新加入的節點,而新加入的節點則指向原來前驅指向的節點。上圖演示了如何在 eggs 後加入 cookies。
刪除鍊錶中已有元素:
從鍊錶中刪除乙個元素也很簡單。只需要將待刪除元素的前驅節點指向待刪除元素的後繼節點。上圖展示了從單向鍊錶中刪除bacon。
除了插入和刪除,鍊錶還有其他一些操作,後面將給出講解。
設計乙個基於物件的鍊錶
我們需要設計兩個類,node 類用來表示節點, linkedlist 類提供插入節點、刪除節點、顯示列表元素的方法,以及其他一些輔助方法。
node類:
function node(element)linkedlist 類:
function llist()測試:llist.prototype=
return currnode;
},
//向某一元素後面插入新節點
insert:function(newelement,item),
//查詢某一節點的前乙個節點(前驅)
findprevious:function(item)
return currnode;
},
//刪除某乙個節點
remove:function(item)
}, //修改某一節點的資料
edit:function(item,newitem),
//在控制台列印出所有節點(為了方便預覽)
display:function()
} }
var names = new llist();names.insert("likek", "head");//往頭節點後插入節點likek
names.insert("zhangsan", "likek");//往likek後插入節點zhangsan
names.insert("lisi", "zhangsan");//往zhangsan後插入節點lisi
names.insert("wangwu", "lisi");//往lisi後插入節點wangwu
names.display();
/*likek
zhangsan
lisi
wangwu*/
names.remove("zhangsan");//刪除zhangsan節點
names.display();
/*likek
lisi
wangwu*/
names.edit("lisi","wangnima");//將lisi節點改為wangnima
names.display();
/*likek
wangnima
wangwu*/
php實現資料結構 單向鍊錶
什麼是單向鍊錶 鍊錶是以鏈式儲存資料的結構,其不需要連續的儲存空間,鍊錶中的資料以節點來表示,每個節點由元素 儲存資料 和指標 指向後繼節點 組成。單向鍊錶 也叫單鏈表 是鍊錶中最簡單的一種形式,每個節點只包含乙個元素和乙個指標。它有乙個表頭,並且除了最後乙個節點外,所有節點都有其後繼節點。它的儲存...
資料結構 單向鍊錶(java實現)
public class node 為節點追加節點 當前節點 node currentnode this while true 賦值當前節點 currentnode nextnode 把需要追回的節點追加為找到的節點的下乙個節點 currentnode.next node return this 刪...
資料結構 單向鍊錶的實現
單向鍊錶的實現 記錄 非常菜雞的開始 節點中定義節點時 成員變數要寫struct 因為沒寫報了一堆錯 老師節點裡的node都是變數型別,只有linknode內部是指標型別,內部使用指標,指標大小為4個位元組 可以分配記憶體很方便。注意teacher輸入的時候為位址 各種指標型別的轉換 main函式中...