golang 實(shí)現(xiàn)鏈表爽不爽?
猶記得剛學(xué) C 語(yǔ)言的時(shí)候,學(xué)到指針這一章,就會(huì)有讓我們寫(xiě)鏈表的需求,頭插法,尾插法,翻轉(zhuǎn)鏈表,合并鏈表,約瑟夫環(huán)等等
學(xué)的不亦樂(lè)乎,但是 對(duì)于指針剛學(xué)的時(shí)候,真是摸不著腦殼,不知道 xdm 會(huì)有這種感受嗎,**動(dòng)不動(dòng)就段錯(cuò)誤**
**今天,我們來(lái)看看 golang? 寫(xiě)鏈表是有多爽**
思路大概是這樣的:
- 這里我們簡(jiǎn)單寫(xiě),就不寫(xiě)循環(huán)鏈表了
- 需要一個(gè)鏈表結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體得有頭指針,有尾指針
- 需要一個(gè)節(jié)點(diǎn)的結(jié)構(gòu)體,這個(gè)里面有節(jié)點(diǎn)的數(shù)據(jù),節(jié)點(diǎn)的下一個(gè)指針
- 我們這就來(lái)實(shí)現(xiàn) **頭插法** 和 **尾插法**吧
## 定義數(shù)據(jù)結(jié)構(gòu)
- 定義鏈表結(jié)構(gòu)
```go
type MyList struct {
? ? head *ListNode
? ? tail *ListNode
}
```
- 定義節(jié)點(diǎn)結(jié)構(gòu)
```go
type ListNode struct {
? ? num int
? ? next * ListNode
}
```
## 實(shí)現(xiàn)頭插法
所謂鏈表,就像排隊(duì)一樣,隊(duì)員和隊(duì)員之間用線(xiàn)連起來(lái),但是這個(gè)線(xiàn)是有一個(gè)明確方向的,**頭插法,就是從鏈表頭插入元素,新元素成為頭**
```go
func (list *MyList) HeadInsert(num int) {
// 初始化一個(gè)節(jié)點(diǎn),填入數(shù)據(jù),和下一個(gè)指針指向 空
node := &ListNode{
num:? num,
next: nil,
}
// 判斷尾巴 和 頭都是空,那么說(shuō)明這一次是第 一個(gè)節(jié)點(diǎn),頭和尾都指向這個(gè)節(jié)點(diǎn)即可
if list.tail == nil && list.head == nil {
list.tail = node
list.head = node
return
}
// 頭插,從頭插入
node.next = list.head
list.head = node
}
```
## 實(shí)現(xiàn)尾插法
**尾插法就是從鏈表尾巴插入元素,新元素成為尾巴**
```go
func (list *MyList) TailInsert(num int) {
// 初始化一個(gè)節(jié)點(diǎn),填入數(shù)據(jù),和下一個(gè)指針指向 空
node := &ListNode{
num:? num,
next: nil,
}
// 判斷尾巴 和 頭都是空,那么說(shuō)明這一次是第 一個(gè)節(jié)點(diǎn),頭和尾都指向這個(gè)節(jié)點(diǎn)即可
if list.tail == nil && list.head == nil {
list.tail = node
list.head = node
return
}
// 尾插,從尾插入
list.tail.next = node
list.tail = node
}
```
看到上述寫(xiě)的尾插法和頭插法是不是寫(xiě)法很類(lèi)似,其實(shí)就是后面的幾行代碼邏輯不一樣而已,原理都是一樣的
go 里面無(wú)論是使用指針,還是使用結(jié)構(gòu)體,都是使用 `.` ,而不像 C 里面使用 `->`
## 遍歷鏈表
遍歷鏈表就非常簡(jiǎn)單了,一個(gè)一個(gè)打出來(lái)就可以了
```go
func (list *MyList) PrintList() {
if list == nil{
fmt.Println("list is nil")
return
}
tmp := list.head
for tmp != nil{
fmt.Println(tmp.num)
tmp = tmp.next
}
}
```
## 聯(lián)合上述方法一起跑一遍
我們聯(lián)合上述的代碼,拼拼湊湊來(lái)實(shí)現(xiàn)我們的鏈表
- (頭插或者尾插)插入 10 個(gè)數(shù)據(jù)
- 遍歷一下鏈表
```go
func main() {
// 插入 10 個(gè)數(shù)
l := MyList{}
for i:=0;i<10;i++{
l.HeadInsert(i)
}
l.PrintList()
}
```
**看完的兄弟們是什么感受,有沒(méi)有覺(jué)得使用 golang 寫(xiě)鏈表真的是非常簡(jiǎn)單的事情,當(dāng)然鏈表的思想還是和 C 是一樣一樣的,只不過(guò) 用 golang 來(lái)實(shí)現(xiàn)真的太方便了**
## 歡迎點(diǎn)贊,關(guān)注,收藏
朋友們,你的支持和鼓勵(lì),是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力

好了,本次就到這里
技術(shù)是開(kāi)放的,我們的心態(tài),更應(yīng)是開(kāi)放的。擁抱變化,向陽(yáng)而生,努力向前行。
我是**阿兵云原生**,歡迎點(diǎn)贊關(guān)注收藏,下次見(jiàn)~?