分享下最近使用golang模擬的鏈表數據結構

首先,我們知道鏈表的特性,分別有單線鏈表雙線鏈表,下面我用golang來模擬了一個單線鏈表

鏈表的添加,他其實分別是有頭部插入法尾部插入法的,我在代碼中都寫了這兩個方法

結構體 Student 是必須要有一個指針,這個指針是指向下一個鏈表的,當然,如果是雙向鏈表的話,這裏還需要記錄一個頭部指針,也就是說這個結構體會有兩個指針

type Student struct {
    Name  string
    Age   int
    Score float32
    next  *Student
}

 

一個小細節:在插入某一個節點,比如 a b c 三個節點,我需要插入一個d 在 a 和 b 之間,這時候遍歷到b 之後再進行插入,不然你如果在a的時候就開始進行插入操作,那麼你是獲取不到b節點的尾部的

 

雙向鏈表

 

 

完整的代碼:

package main

import (
    "fmt"
    "math/rand"
)

/*
    鏈表的結構
*/
type Student struct {
    Name  string
    Age   int
    Score float32
    next  *Student
}

/*
    尾部插入法
*/
func insertTail(p *Student) {
    var tail = p // 初始化節點
    for i := 0; i < 10; i++ {
        stu := Student{
            Name:  fmt.Sprintf("stu%d", i),
            Age:   rand.Intn(100),
            Score: rand.Float32() * 100,
        }
        tail.next = &stu
        tail = &stu // 需要把tail弄到新的節點重新初始化
    }
}
/*
    遍歷鏈表
*/
func trans(p *Student) {
    for p != nil {
        fmt.Println(*p)
        p = p.next
    }
}

/*
    頭部插入法
*/
func insertHead(p **Student) {

    for i := 0; i < 10; i++ {
        stu := Student{
            Name:  fmt.Sprintf("stu%d", i),
            Age:   rand.Intn(100),
            Score: rand.Float32() * 100,
        }
        stu.next = *p
        *p = &stu
    }
}

/*
    刪除節點 這裏會有個問題,就是頭節點不能刪除
*/
func delNode(p *Student) {
    var prev *Student = p // 這個是臨時變量,保存上一個節點
    for p != nil {
        if p.Name == "stu6" {
            prev.next = p.next // 上一個節點就等於下一個節點
            break
        }
        prev = p // 這個是記錄每次循環中的自己
        p = p.next
    }
}

/*
    在指定節點插入一個節點
*/
func addNode(p *Student, newNode *Student) {

    for p != nil {
        if p.Name == "stu5" {
            newNode.next = p.next //新節點的next等於當前節點的next
            p.next = newNode      // 當前節點的next等於新節點的結構體
            break
        }
        p = p.next
    }
}

func main() {
    var head *Student = new(Student) // 頭節點
    head.Age = 18
    head.Score = 99
    head.Name = "asdsad"
    insertHead(&head) // 添加一些節點 循環去添加吧,模擬
    delNode(&head) // 刪除某一個鏈表

    var newNode *Student = new(Student) // 插入一個節點
    newNode.Age = 18
    newNode.Score = 99
    newNode.Name = "stu1000"
    addNode(head, newNode) // 插入節點

    trans(head) // 遍歷
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章