introduction
- 結構體會有一些自己的字段,但其中有一個字段,是指向自己結構體類型的指針類型
- 使用此結構體做為類型的變量,被稱為節點
- 每個節點包含下一個節點的地址,這樣可把所有的節點都串起來
- 通常鏈表中的第一個節點被叫做鏈表頭
https://zh.wikipedia.org/wiki/%E9%93%BE%E8%A1%A8
範例
1 | type Student struct{ |
[1] 結構體的前半部為結構體的一般字段(屬性),Next
字段的類型為自身結構體的指針
單向鏈表
又稱單向連結串列,它包含兩個域一個資訊域(一般屬性)和一個指標域(Next
字段)。
指標域連結指向鏈表中的下一個節點,而最後一個節點則指向一個空值(nil
)。
透過Next
字段可將使用同種結構體類型的變量全部遍歷
相當於使用一條繩子將所有結構體串起來
缺點:要遍歷整張鏈表,需記住鏈表頭的地址;從其他任一節點開始遍歷都無法完整查看整張鏈表
- 若將最後一個節點的
next
字段指向鏈表頭地址,則為循環單鏈表
鏈表與陣列
陣列:在固定長度且連續內存空間中,通過index
訪問各陣列內的元素
鏈表:鏈表的內存空間分配不是連續的,元素之間串聯需通過指針,(Next
字段)
且鏈表的長度不固定,可隨時增加或減少
新增與插入節點-尾部插入法
1 | package main |
[1] Next
字段不寫的情況下默認為空
tips
- 請注意!!,此方法新增的節點都只能在末尾插入
- 讓末尾節點的
Next
字段,從原本指向空(nil
)改成指向一個新的節點地址
遍歷鏈表的節點
1 | package main |
result
1 | {Curtis 18 90 0xc04206a1e0} |
批量創建節點-尾部插入
於main函數中實現
1 | package main |
函數化實現
1 | package main |
result
1 | {Curtis 18 90 0xc04206a210} |
頭部插入法
於main函數中實現
1 | package main |
函數化實現
1 | package main |
result
1 | {stu9 37 21.855305259276427 0xc04206a3c0} |
刪除節點
紀錄要被刪除節點的上一節點地址,並將上一節點的next
字段替換為要刪除節點的next
字段(亦就是下一節點的地址)
於main函數中實現
1 | package main |
函數化實現
1 | package main |
result
1 | {Student0 81 94.05090880450125 0xc042074240} |
節點插入
找到要被插入的節點,讓新節點指向原本的Next
字段,在讓當前節點指向新節點
1 | package main |
result
1 | {Curtis 18 90 0xc042074210} |
雙向鏈表
每個節點有兩個連線:一個指向前一個節點(prev
字段),(當此「連線」為第一個「連線」時,指向空值(nil
)或者空列表)
而另一個指向下一個節點(next
字段),(當此「連線」為最後一個「連線」時,指向空值(nil
)或者空列表)
- 在任何節點皆能遍歷整張列表