golang数据结构之单链表

时间:2022-07-23
本文章向大家介绍golang数据结构之单链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

实现单链表的增删查改。

目录如下:

singleLink.go

package link

import (
    "fmt"
)

//HeroNode 链表节点
type HeroNode struct {
    ID   int
    Name string
    next *HeroNode //指针
}

//InsertHeroNode 插入
func InsertHeroNode(head *HeroNode, newHeroNode *HeroNode) {
    tmp := head
    for {
        if tmp.next == nil {
            break
        }
        tmp = tmp.next
    }
    tmp.next = newHeroNode
}

//InsertHeroNodeByID 根据id从小到大插入
func InsertHeroNodeByID(head *HeroNode, newHeroNode *HeroNode) {
    tmp := head

    for {
        if tmp.next == nil {
            tmp.next = newHeroNode
            break
        }
        if tmp.next.ID > newHeroNode.ID {
            tmp2 := tmp.next
            tmp.next = newHeroNode
            newHeroNode.next = tmp2
            break
        } else if tmp.next.ID == newHeroNode.ID {
            fmt.Printf("已经存在id为%d的节点n", tmp.next.ID)
            break
        } else {
            tmp = tmp.next
        }
    }

}

//DeleteHeroNode 删除
func DeleteHeroNode(head *HeroNode, ID int) {
    tmp := head
    for {
        if tmp.next == nil {
            fmt.Println("链表中没有该id")
            break
        }
        if tmp.next.ID == ID {
            if tmp.next.next == nil {
                tmp.next = nil
            } else {
                tmp2 := tmp.next.next
                tmp.next = tmp2
            }
            break
        } else {
            tmp = tmp.next
        }
    }
}

//FindHeroNode 查找
func FindHeroNode(head *HeroNode, ID int) {
    tmp := head
    for {
        if tmp.next == nil {
            fmt.Println("链表中没有该id")
            break
        }
        if tmp.next.ID == ID {
            fmt.Println("找到了该id")
            break
        } else {
            tmp = tmp.next
        }
    }
}

//ModifyHeroNode 修改
func ModifyHeroNode(head *HeroNode, ID int, changeName string) {
    tmp := head
    for {
        if tmp.next == nil {
            fmt.Println("链表中没有该id")
            break
        }
        if tmp.next.ID == ID {
            tmp.next.Name = changeName
            break
        } else {
            tmp = tmp.next
        }
    }
}

//ListHeroNode 显示信息
func ListHeroNode(head *HeroNode) {
    tmp := head
    if tmp.next == nil {
        fmt.Println("链表为空")
        return
    }
    for {
        fmt.Printf("节点信息如下:id=%d,name=%sn", tmp.next.ID, tmp.next.Name)
        tmp = tmp.next
        if tmp.next == nil {
            fmt.Println("已显示所有信息")
            break
        }
    }
}

main.go

package main

import "go_code/data_structure/link"

func main() {

    head := &link.HeroNode{}
    hero1 := &link.HeroNode{
        ID:   1,
        Name: "宋江",
    }
    hero2 := &link.HeroNode{
        ID:   2,
        Name: "李逵",
    }
    hero4 := &link.HeroNode{
        ID:   4,
        Name: "林冲",
    }
    hero3 := &link.HeroNode{
        ID:   3,
        Name: "武松",
    }
    // link.InsertHeroNode(head, hero1)
    // link.InsertHeroNode(head, hero2)
    // link.InsertHeroNode(head, hero4)
    // link.InsertHeroNode(head, hero3)

    link.InsertHeroNodeByID(head, hero2)
    link.InsertHeroNodeByID(head, hero1)
    link.InsertHeroNodeByID(head, hero4)
    link.InsertHeroNodeByID(head, hero3)
    link.DeleteHeroNode(head, 3)
    link.FindHeroNode(head, 4)
    link.ModifyHeroNode(head, 4, "我是修改后的英雄")
    link.ListHeroNode(head)
}

运行结果: