Golang使用切片實現(xiàn)單鏈表的示例代碼
單鏈表(Single Linked List)是鏈表數(shù)據(jù)結(jié)構(gòu)的一種實現(xiàn)方式,它包含一系列節(jié)點(Node),每個節(jié)點都包含一個數(shù)據(jù)域和一個指向下一個節(jié)點的指針。與數(shù)組相比,鏈表的一個主要優(yōu)點是它們可以動態(tài)地進(jìn)行擴展和收縮,因為它們的元素在內(nèi)存中不是連續(xù)存儲的。
通過定義結(jié)構(gòu)體實現(xiàn)單鏈表的操作,no為鏈表中節(jié)點的id,name為節(jié)點id對應(yīng)的內(nèi)容,next為下一個節(jié)點的信息
type HeroNode struct { no int name string next *HeroNode }
InputNode方法,為鏈表添加節(jié)點。通過定義輔助節(jié)點,找到鏈表的最后一個節(jié)點,并將要添加的節(jié)點添加到找到的節(jié)點的下一個節(jié)點。
func InputNode(head *HeroNode, hero *HeroNode) { text := head for { if text.next == nil { break } text = text.next } text.next = hero }
InputNode2方法,為鏈表順序添加節(jié)點。首先還是定義一個輔助節(jié)點,這次還另外定義一個flag為了判斷要插入的節(jié)點是否已經(jīng)存在。通過輔助節(jié)點進(jìn)行判斷插入的節(jié)點的id,并進(jìn)行插入對應(yīng)位置。這里要注意的是需要先將要插入的節(jié)點的下一個節(jié)點改為輔助節(jié)點的下一個節(jié)點,然后再將輔助節(jié)點的下一個節(jié)點換為要插入的節(jié)點。一旦先將text.next=hero,原本text后面的節(jié)點將會失去前置節(jié)點,那么hero節(jié)點將添加失敗
func InputNode2(head *HeroNode, hero *HeroNode) { text := head flag := true //讓插入的節(jié)點的no,和text的下一個節(jié)點的no進(jìn)行比較 for { if text.next == nil { break } else if text.next.no > hero.no { //說明hero應(yīng)該插入到text后面 break } else if text.next.no == hero.no { flag = false break } text = text.next } if !flag { fmt.Println("已經(jīng)存在", hero.no) return } else { hero.next = text.next text.next = hero } }
DelectNode方法,刪除鏈表中的節(jié)點。通過定義輔助節(jié)點和flag進(jìn)行對要刪除節(jié)點的查詢,查詢后將text的下一個節(jié)點指向text下一個節(jié)點的下一個節(jié)點即可完成節(jié)點的刪除。
func DelectNode(hero *HeroNode, id int) { text := hero flag := false for { if text.next == nil { break } else if text.next.no == id { //說明找到了 flag = true break } text = text.next } if flag { text.next = text.next.next } else { fmt.Println("刪除id不存在", id) } }
ShowNode方法,實現(xiàn)顯示鏈表中的節(jié)點。先判斷鏈表是否為空鏈表然后進(jìn)行鏈表的打印輸出,直到鏈表為空。
func ShowNode(head *HeroNode) { // 創(chuàng)建一個輔助節(jié)點 text := head // 判斷是否為空鏈表 if text.next == nil { fmt.Println("空鏈表") return } for { fmt.Printf("[%d ,%s ]==>", text.next.no, text.next.name) text = text.next if text.next == nil { break } } }
主函數(shù)。定義了一個根節(jié)點head,定義了5個要添加的節(jié)點,并將他們按照順序添加,之后打印顯示出整個鏈表,然后刪除掉節(jié)點id為"1"的數(shù)據(jù),并再次打印顯示鏈表。
func main() { // 創(chuàng)建根節(jié)點 head := &HeroNode{} hero1 := &HeroNode{ no: 1, name: "張明", } hero2 := &HeroNode{ no: 2, name: "李華", } hero3 := &HeroNode{ no: 3, name: "王五", } hero4 := &HeroNode{ no: 4, name: "張三", } hero5 := &HeroNode{ no: 5, name: "花花", } InputNode2(head, hero1) InputNode2(head, hero2) InputNode2(head, hero3) InputNode2(head, hero4) InputNode2(head, hero5) ShowNode(head) fmt.Println() DelectNode(head, 1) ShowNode(head) }
整體代碼的實現(xiàn)
以上就是Golang使用切片實現(xiàn)單鏈表的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Golang切片單鏈表的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
go語言區(qū)塊鏈學(xué)習(xí)調(diào)用以太坊
這篇文章主要為大家介紹了go語言區(qū)塊鏈學(xué)習(xí)如何調(diào)用以太坊的示例實現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10golang解析網(wǎng)頁利器goquery的使用方法
這篇文章主要給大家介紹了關(guān)于golang解析網(wǎng)頁利器goquery的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09