[數據結構]第二章線性表(3)——單鏈表

單鏈表

image-20200618221439465

image-20200618221516210

什麼是單鏈表?

image-20200618221658525

單鏈表的定義

image-20200618221959788

別名

image-20200618222203154

image-20200618222313544

註釋:或者可以理解爲指向頭節點的指針既可以表示整個單鏈表也可以表示頭節點,爲了便於區分才建議使用 typedef 進行重命名,以方便區別其不同的含義

頭插法建立單鏈表

image-20200619095117732

單鏈表的基本操作

單鏈表的初始化

不帶頭節點的單鏈表的初始化

image-20200619095400757

帶頭節點的單鏈表的初始化

image-20200619095545238

兩者區別是什麼?

image-20200619095738329

總結

image-20200619095821536

插入和刪除

image-20200619104612536

插入

按位序插入(帶頭節點的單鏈表)

image-20200619105030154

具體實現

分析在表頭插入

image-20200619105401211

分析爲什麼不能顛倒

image-20200619105451377

分析在表中插入

image-20200619105800111

分析在表尾插入

image-20200619110039686

分析插入位置超出表長

image-20200619110159253

總結

image-20200619110309541

按位插入(不帶頭節點)

image-20200619110418752

具體實現

image-20200619110547637

結論:不帶頭節點的單鏈表,寫代碼更不方便,除非特別聲明,默認推薦使用帶頭節點的實現方式,還有要注意在考試中帶頭、不帶頭都有可能考察,注意審題。

指定節點的後插操作

image-20200619111032277

指定節點的前插操作

通過傳入頭指針實現前插

image-20200619111607840

先進行後插,然後交換前後數據,以此實現前插

image-20200619111716141

image-20200619111814873

刪除

帶有頭節點版本

image-20200619111915877

具體實現

image-20200619135048885

刪除指定結點

image-20200619135226089

如果P是最後一個節點,咋辦?

只能從表頭表頭依次尋找前驅,時間複雜度O(n)

image-20200619135401028

單鏈表的侷限性:無法逆向檢索!!

總結

image-20200619135623242

查找

按位查找(帶頭節點)

image-20200619152704151

#####按值查找(帶頭節點)

image-20200619153147639

求表的長度(帶頭節點)

image-20200619153411974

總結

image-20200619153525681

單鏈表的建立方法

image-20200619153742876

PS:找不到對象就娶一個數據元素吧!哈哈

尾插法

第一種方法:

image-20200619154012867

問題:時間複雜度太高!!可以用一個指針記錄最後一個數據元素的位置來優化時間。

優化之後:

image-20200619172815577

頭插法

image-20200619172945304

具體實現:

image-20200619173800669

總結

image-20200619173925151