您好,登錄后才能下訂單哦!
本文小編為大家詳細(xì)介紹“Go語言中單鏈表如何使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“Go語言中單鏈表如何使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。
一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。鏈表由一系列結(jié)點(diǎn)(鏈表中每一個(gè)元素稱為結(jié)點(diǎn))組成,結(jié)點(diǎn)可以在運(yùn)行時(shí)動(dòng)態(tài)生成。每個(gè)結(jié)點(diǎn)包括兩個(gè)部分:一個(gè)是存儲(chǔ)數(shù)據(jù)元素的數(shù)據(jù)域,另一個(gè)是存儲(chǔ)下一個(gè)結(jié)點(diǎn)地址的指針域。使用鏈表結(jié)構(gòu)可以避免在使用數(shù)組時(shí)需要預(yù)先知道數(shù)據(jù)大小的缺點(diǎn),鏈表結(jié)構(gòu)可以充分利用計(jì)算機(jī)內(nèi)存空間,實(shí)現(xiàn)靈活的內(nèi)存動(dòng)態(tài)管理。但是鏈表失去了數(shù)組隨機(jī)讀取的優(yōu)點(diǎn),同時(shí)鏈表由于增加了結(jié)點(diǎn)的指針域,空間開銷比較大。
利用 struct 可以包容多種數(shù)據(jù)類型,結(jié)構(gòu)體內(nèi)也可以包含多個(gè)成員,這些成員可以是基本類型、自定義類型、數(shù)組類型,也可以是指針類型。這里可以使用指針類型成員來存放下一個(gè)結(jié)點(diǎn)的地址。如以下定義,成員 data 用來存放結(jié)點(diǎn)中的數(shù)據(jù)(整數(shù)類型),next 是指針類型的成員,它指向 ListNode struct 類型數(shù)據(jù),也就是下一個(gè)結(jié)點(diǎn)的數(shù)據(jù)類型。
type ListNode struct { data int next *ListNode }
節(jié)點(diǎn)聲明和賦值有以下幾種格式:
package main import "fmt" type ListNode struct { data int next *ListNode } func main() { var head *ListNode head = new(ListNode) head.data = 1 var node1 = new(ListNode) node1.data = 2 var node2 = &ListNode{3, nil} var node3 = &ListNode{data: 4} fmt.Println(*head) fmt.Println(*node1) fmt.Println(*node2) fmt.Println(*node3) } /* 輸出: {1 <nil>} {2 <nil>} {3 <nil>} {4 <nil>} */
一個(gè)for循環(huán)即可,結(jié)構(gòu)描述的鏈表沒有空鏈表的,不論data是何種類型,一旦聲明即使不馬上賦值也會(huì)有類型默認(rèn)值,比如new(ListNode)即賦值了ListNode{0, nil}。
func showNode(p *ListNode) { fmt.Print(*p) for p.next != nil { p = p.next fmt.Print("->", *p) } fmt.Println() }
新結(jié)點(diǎn)放在鏈表的最前面
package main import "fmt" type ListNode struct { data int next *ListNode } func showNode(p *ListNode) { fmt.Print(*p) for p.next != nil { p = p.next fmt.Print("->", *p) } fmt.Println() } func main() { var head = &ListNode{0, nil} for i := 1; i < 5; i++ { var node = ListNode{data: i} node.next = head head = &node } showNode(head) } /* 輸出: {4 0xc000084250}->{3 0xc000084240}->{2 0xc000084230}->{1 0xc000084220}->{0 <nil>} */
新結(jié)點(diǎn)追加到鏈表的最后面
package main import "fmt" type ListNode struct { data int next *ListNode } func showNode(p *ListNode) { fmt.Print(*p) for p.next != nil { p = p.next fmt.Print("->", *p) } fmt.Println() } func main() { var head, tail *ListNode head = &ListNode{0, nil} tail = head for i := 1; i < 5; i++ { var node = ListNode{data: i} (*tail).next = &node tail = &node } showNode(head) } /* 輸出: {0 0xc000084220}->{1 0xc000084230}->{2 0xc000084240}->{3 0xc000084250}->{4 <nil>} */
方法的定義:參數(shù)表放在函數(shù)名前
package main import "fmt" type ListNode struct { data int next *ListNode } func (p *ListNode) travel() { fmt.Print(p.data) for p.next != nil { p = p.next fmt.Print("->", p.data) } fmt.Println("<nil>") } func main() { var head = &ListNode{0, nil} head.travel() for i := 1; i < 10; i++ { var node = ListNode{data: i} node.next = head head = &node } head.travel() var root *ListNode root = new(ListNode) root.travel() } /* 輸出: 0<nil> 9->8->7->6->5->4->3->2->1->0<nil> 0<nil> */
注意:函數(shù)與方法的區(qū)別
package main import "fmt" type ListNode struct { data int next *ListNode } func (head *ListNode) size() int { size := 1 for head = head.next; head != nil; size++ { head = head.next } return size } func Len(head *ListNode) int { size := 1 for head = head.next; head != nil; size++ { head = head.next } return size } func main() { var head = &ListNode{0, nil} fmt.Println(Len(head)) fmt.Println(head.size()) for i := 1; i < 10; i++ { var node = ListNode{data: i} node.next = head head = &node } fmt.Println(Len(head)) fmt.Println(head.size()) } /* 輸出: 1 1 10 10 */
package main import ( "fmt" ) type ListNode struct { data int next *ListNode } func (head *ListNode) size() int { size := 1 for head = head.next; head != nil; size++ { head = head.next } return size } func (head *ListNode) tolist() []int { var res []int res = make([]int, 0, head.size()) for head.next != nil { res = append(res, head.data) head = head.next } res = append(res, head.data) return res } func (head *ListNode) tolist2() []int { var res []int res = make([]int, 0, head.size()) res = append(res, head.data) head = head.next for head != nil { res = append(res, head.data) head = head.next } return res } func main() { var head = &ListNode{0, nil} for i := 1; i < 10; i++ { var node = ListNode{data: i} node.next = head head = &node } fmt.Println(head.tolist()) var root, tail *ListNode root = &ListNode{0, nil} tail = root for i := 1; i < 10; i++ { var node = ListNode{data: i} (*tail).next = &node tail = &node } fmt.Println(root.tolist2()) } /* 輸出: [9 8 7 6 5 4 3 2 1 0] [0 1 2 3 4 5 6 7 8 9] */
package main import "fmt" type ListNode struct { data int next *ListNode } func (p *ListNode) travel() { fmt.Print(p.data) for p.next != nil { p = p.next fmt.Print("->", p.data) } fmt.Println("<nil>") } func toNode(list []int) *ListNode { var head, tail *ListNode head = &ListNode{list[0], nil} tail = head for i := 1; i < len(list); i++ { var node = ListNode{data: list[i]} (*tail).next = &node tail = &node } return head } func main() { var lst = []int{1, 3, 2, 3, 5, 6, 6, 8, 9} toNode(lst).travel() } /* 輸出: 1->3->2->3->5->6->6->8->9<nil> */
讀到這里,這篇“Go語言中單鏈表如何使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。