猶記得剛學 C 語言的時候,學到指標這一章,就會有讓我們寫連結串列的需求,頭插法,尾插法,翻轉連結串列,合併連結串列,約瑟夫環等等
學的不亦樂乎,但是 對於指標剛學的時候,真是摸不著腦殼,不知道 xdm 會有這種感受嗎,動不動就段錯誤
今天,我們來看看 golang 寫連結串列是有多爽
思路大概是這樣的:
- 這裡我們簡單寫,就不寫迴圈連結串列了
- 需要一個連結串列結構體,這個結構體得有頭指標,有尾指標
- 需要一個節點的結構體,這個裡面有節點的資料,節點的下一個指標
- 我們這就來實現 頭插法 和 尾插法吧
定義資料結構
- 定義連結串列結構
type MyList struct {
head *ListNode
tail *ListNode
}
- 定義節點結構
type ListNode struct {
num int
next * ListNode
}
實現頭插法
所謂連結串列,就像排隊一樣,隊員和隊員之間用線連起來,但是這個線是有一個明確方向的,頭插法,就是從連結串列頭插入元素,新元素成為頭
func (list *MyList) HeadInsert(num int) {
// 初始化一個節點,填入資料,和下一個指標指向 空
node := &ListNode{
num: num,
next: nil,
}
// 判斷尾巴 和 頭都是空,那麼說明這一次是第 一個節點,頭和尾都指向這個節點即可
if list.tail == nil && list.head == nil {
list.tail = node
list.head = node
return
}
// 頭插,從頭插入
node.next = list.head
list.head = node
}
實現尾插法
尾插法就是從連結串列尾巴插入元素,新元素成為尾巴
func (list *MyList) TailInsert(num int) {
// 初始化一個節點,填入資料,和下一個指標指向 空
node := &ListNode{
num: num,
next: nil,
}
// 判斷尾巴 和 頭都是空,那麼說明這一次是第 一個節點,頭和尾都指向這個節點即可
if list.tail == nil && list.head == nil {
list.tail = node
list.head = node
return
}
// 尾插,從尾插入
list.tail.next = node
list.tail = node
}
看到上述寫的尾插法和頭插法是不是寫法很類似,其實就是後面的幾行程式碼邏輯不一樣而已,原理都是一樣的
go 裡面無論是使用指標,還是使用結構體,都是使用 .
,而不像 C 裡面使用 ->
遍歷連結串列
遍歷連結串列就非常簡單了,一個一個打出來就可以了
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
}
}
聯合上述方法一起跑一遍
我們聯合上述的程式碼,拼拼湊湊來實現我們的連結串列
- (頭插或者尾插)插入 10 個資料
- 遍歷一下連結串列
func main() {
// 插入 10 個數
l := MyList{}
for i:=0;i<10;i++{
l.HeadInsert(i)
}
l.PrintList()
}
看完的兄弟們是什麼感受,有沒有覺得使用 golang 寫連結串列真的是非常簡單的事情,當然連結串列的思想還是和 C 是一樣一樣的,只不過 用 golang 來實現真的太方便了
歡迎點贊,關注,收藏
朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這裡
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是阿兵雲原生,歡迎點贊關注收藏,下次見~