1.為什麼用linkedlist
array是乙個非常有用的資料結構,但是有兩個限制:(1)當改變原有array的size的時候需要將原有array的所有元素copy到新array中去(2)由於array的資料儲存在記憶體中是連續空間,導致插入和刪除都會帶來其他資料的移動。
鍊錶是由一系列的節點組成,這些節點可以處在不從的記憶體位置,通過指標將這些節點連線在一起。
2.單鏈表
2.1只有head變數的單鏈表
單鏈表如圖所示:
public
classnode
publicnode(inti, node n)
(2)add操作:在單鏈表的末尾新增新的節點
node head =newnode(1);
head.next =newnode(2);
head.next.next =newnode(3);
問題:如果新增的節點很多的話,例如100,1000等,此方式行不通,因為head.next.···無數個next···.next會讓人抓狂。
2.2有 head、tail變數的單鏈表
為了解決該問題,在單鏈表上加上tail的。
在末端新增新的節點為
tail.next =newnode(i);
tail = tail.next;
問題:新增了tail以後仍然有問題,如果要刪除某個節點的話,則需要從頭開始尋找該節點以及該節點的前乙個節點,然後刪除,時間複雜度為o(n)。以刪除最後乙個節點為例,**如下:
publicnode deletefromtail()
else
if(tmp.next==null)
else
}returndeletenode;
3.雙鏈表
為了解決上面的問題,在node裡新增了指向前乙個節點的變數,如下圖所示:
如下為從雙鏈表從鍊錶末尾刪除節點的實現,少了單鏈表的輪詢刪除。
publicnode deletefromtail2()
else
}returndeletenode;
4.迴圈鍊錶
場景:如果有幾個程式輪流使用cpu,則會構成迴圈列表。
其實用上面的單鏈表或雙鏈表也可以實現,只是每次都要對current的位置進行判斷:是不是到了tail的位置,如果是,則current=head重新輪迴;如果不是,則current=current.next。
5.跳表(skip list)
鍊錶的優點:插入和刪除操作簡單,不會像陣列那樣帶來其他元素的位置移動。
鍊錶的缺點:查詢資料的時候很麻煩,從頭開始輪詢,不像陣列那樣通過下標就可以獲得資料。
關於跳表的文章:
講得都很詳細。
鍊錶基礎知識
鍊錶之前要有一定的c語言基礎,如指標,結構體,分配記憶體malloc等,切勿操之過急。第一次接觸可能有點難度,我是把書上的 反覆敲,反覆看注釋,搞了好幾天,才漸漸懂了。閒話少說,上 include include 要用到malloc struct llist int main printf 聯絡人 ...
鍊錶基礎知識整理
關於鍊錶最重要的是搞清楚指標的指向,next域存放的是下乙個結點的位址。1 順序建煉表要定義頭指標,游動指標,尾部指標 逆序建立鍊錶定義頭指標和游動指標即可,每次將新的結點插在頭指標後面。搞清楚指標的指向即可。2 刪除結點。定義乙個游動指標,還要定義乙個指標,為了記後乙個結點的位址。順序建表 inc...
鍊錶的基礎知識
鍊錶基礎知識 typedef int datatype typedef struct listnode listnode,pnode 鍊錶的初始化 void slistinit pnode phead 建立新結點 pnode buynewnode datatype data 尾插 void slis...