Golang使用切片實(shí)現(xiàn)單鏈表的示例代碼
單鏈表(Single Linked List)是鏈表數(shù)據(jù)結(jié)構(gòu)的一種實(shí)現(xiàn)方式,它包含一系列節(jié)點(diǎn)(Node),每個(gè)節(jié)點(diǎn)都包含一個(gè)數(shù)據(jù)域和一個(gè)指向下一個(gè)節(jié)點(diǎn)的指針。與數(shù)組相比,鏈表的一個(gè)主要優(yōu)點(diǎn)是它們可以動(dòng)態(tài)地進(jìn)行擴(kuò)展和收縮,因?yàn)樗鼈兊脑卦趦?nèi)存中不是連續(xù)存儲的。
通過定義結(jié)構(gòu)體實(shí)現(xiàn)單鏈表的操作,no為鏈表中節(jié)點(diǎn)的id,name為節(jié)點(diǎn)id對應(yīng)的內(nèi)容,next為下一個(gè)節(jié)點(diǎn)的信息
type HeroNode struct { no int name string next *HeroNode }
InputNode方法,為鏈表添加節(jié)點(diǎn)。通過定義輔助節(jié)點(diǎn),找到鏈表的最后一個(gè)節(jié)點(diǎn),并將要添加的節(jié)點(diǎn)添加到找到的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)。
func InputNode(head *HeroNode, hero *HeroNode) { text := head for { if text.next == nil { break } text = text.next } text.next = hero }
InputNode2方法,為鏈表順序添加節(jié)點(diǎn)。首先還是定義一個(gè)輔助節(jié)點(diǎn),這次還另外定義一個(gè)flag為了判斷要插入的節(jié)點(diǎn)是否已經(jīng)存在。通過輔助節(jié)點(diǎn)進(jìn)行判斷插入的節(jié)點(diǎn)的id,并進(jìn)行插入對應(yīng)位置。這里要注意的是需要先將要插入的節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)改為輔助節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn),然后再將輔助節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)換為要插入的節(jié)點(diǎn)。一旦先將text.next=hero,原本text后面的節(jié)點(diǎn)將會(huì)失去前置節(jié)點(diǎn),那么hero節(jié)點(diǎn)將添加失敗
func InputNode2(head *HeroNode, hero *HeroNode) { text := head flag := true //讓插入的節(jié)點(diǎn)的no,和text的下一個(gè)節(jié)點(diǎn)的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é)點(diǎn)。通過定義輔助節(jié)點(diǎn)和flag進(jìn)行對要?jiǎng)h除節(jié)點(diǎn)的查詢,查詢后將text的下一個(gè)節(jié)點(diǎn)指向text下一個(gè)節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)即可完成節(jié)點(diǎn)的刪除。
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方法,實(shí)現(xiàn)顯示鏈表中的節(jié)點(diǎn)。先判斷鏈表是否為空鏈表然后進(jìn)行鏈表的打印輸出,直到鏈表為空。
func ShowNode(head *HeroNode) { // 創(chuàng)建一個(gè)輔助節(jié)點(diǎn) 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ù)。定義了一個(gè)根節(jié)點(diǎn)head,定義了5個(gè)要添加的節(jié)點(diǎn),并將他們按照順序添加,之后打印顯示出整個(gè)鏈表,然后刪除掉節(jié)點(diǎn)id為"1"的數(shù)據(jù),并再次打印顯示鏈表。
func main() { // 創(chuàng)建根節(jié)點(diǎn) 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) }
整體代碼的實(shí)現(xiàn)
以上就是Golang使用切片實(shí)現(xiàn)單鏈表的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于Golang切片單鏈表的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang切片連接成字符串的實(shí)現(xiàn)示例
本文主要介紹了Golang切片連接成字符串的實(shí)現(xiàn)示例,可以使用Go語言中的內(nèi)置函數(shù)"String()"可以將字節(jié)切片轉(zhuǎn)換為字符串,具有一定的參考價(jià)值,感興趣的可以了解一下2023-11-11Golang處理parquet文件實(shí)戰(zhàn)指南
這篇文章主要給大家介紹了關(guān)于Golang處理parquet文件的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-03-03go語言區(qū)塊鏈學(xué)習(xí)調(diào)用以太坊
這篇文章主要為大家介紹了go語言區(qū)塊鏈學(xué)習(xí)如何調(diào)用以太坊的示例實(shí)現(xiàn)過程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10GO實(shí)現(xiàn)基于命令行的簡單IPS程序代碼
本文介紹了入侵防御系統(tǒng)IPS的工作原理和實(shí)現(xiàn),IPS通過網(wǎng)絡(luò)流量監(jiān)控和實(shí)時(shí)響應(yīng),防止網(wǎng)絡(luò)攻擊,通過使用Go語言實(shí)現(xiàn)一個(gè)簡單的IPS示例程序,展示了如何獲取本地IP地址和探測網(wǎng)絡(luò)中其他設(shè)備的IP地址,包括如何定義和加載規(guī)則文件,以及如何檢測IP對相應(yīng)端口的訪問是否達(dá)到規(guī)定閾值2024-12-12golang解析網(wǎng)頁利器goquery的使用方法
這篇文章主要給大家介紹了關(guān)于golang解析網(wǎng)頁利器goquery的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-09-09