Golang单向链表


本文摘自网络,作者,侵删。

package main

import "fmt"

type HeroNode struct {
    No       int
    Name     string
    NickName string
    Next     *HeroNode
}

// 插入一个新结点
func InsetHeroNode(head *HeroNode, newHeroNode *HeroNode) {
    // 1.先找到该链表的最后这个结点
    // 2.创建一个辅助结点[跑龙套, 帮忙]
    temp := head
    for {
        if temp.Next == nil {
            break
        }
        temp = temp.Next
    }
    // 3.将newHeroNode加入到链表的最后
    temp.Next = newHeroNode
}

// 根据no的编号从小到大插入..
func InsetHeroNodeBySort(head *HeroNode, newHeroNode *HeroNode) {
    // 1.先找到该链表的最后这个结点
    // 2.创建一个辅助结点[跑龙套, 帮忙]
    temp := head
    flag := true
    for {
        // 说明该链表为空或者到最后
        if temp.Next == nil {
            break
        }
        // 说明newHeroNode就应该插入到temp后面
        if temp.Next.No > newHeroNode.No {
            break
        }
        // 说明这个链表中货已经存在了该no
        if temp.Next.No == newHeroNode.No {
            flag = false
            break
        }
        // 漂移链表位置
        temp = temp.Next
    }
    if !flag {
        fmt.Println("已经存在no=", newHeroNode.No)
        return
    }
    // 插入链表
    newHeroNode.Next = temp.Next
    temp.Next = newHeroNode
}

// 删除一个结点
func DelHeroNode(head *HeroNode, no int) {
    // 1.创建一个辅助结点[跑龙套, 帮忙]
    temp := head
    // 2.找到要删除结点的no, 和temp的下一个结点的no比较
    flag := false
    for {
        // 说明到链表的最后
        if temp.Next == nil {
            break
        }
        if temp.Next.No == no {
            flag = true
            break
        }
        // 漂移到下一个结点
        temp = temp.Next
    }
    if !flag {
        fmt.Printf("删除的no不存在\n")
        return
    }
    // 重新指向
    temp.Next = temp.Next.Next
}

//显示链表的所有结点信息
func ListHeroNode(head *HeroNode) {
    // 1.创建一个辅助结点[跑龙套, 帮忙]
    temp := head
    // 先判断该链表是不是一个空的链表
    if temp.Next == nil {
        fmt.Println("heroNode empty")
        return
    }
    // 2.遍历链表
    for {
        fmt.Printf("[%d, %s, %s]-->", temp.Next.No, temp.Next.Name, temp.Next.NickName)
        temp = temp.Next
        if temp.Next == nil {
            break
        }
    }
    fmt.Println()
}

func main() {
    // 1.县创建一个头结点
    head := &HeroNode{}

    //2. 创建一个新的HeroNode
    hero1 := &HeroNode{No: 1, Name: "宋江", NickName: "及时雨"}
    hero3 := &HeroNode{No: 3, Name: "林冲", NickName: "豹子头"}
    hero2 := &HeroNode{No: 2, Name: "卢俊义", NickName: "玉麒麟"}

    //// 3.无序插入
    //fmt.Println("无序插入:")
    //InsetHeroNode(head, hero2)
    //InsetHeroNode(head, hero1)
    //InsetHeroNode(head, hero3)
    //ListHeroNode(head)

    // 4.按从小到大插入
    fmt.Println("按从小到大插入:")
    InsetHeroNodeBySort(head, hero2)
    InsetHeroNodeBySort(head, hero1)
    InsetHeroNodeBySort(head, hero3)
    ListHeroNode(head)

    // 5.删除
    fmt.Print("删除-> no = 1: ")
    DelHeroNode(head, 1)
    ListHeroNode(head)
    fmt.Print("删除-> no = 2: ")
    DelHeroNode(head, 2)
    ListHeroNode(head)
    fmt.Print("删除-> no = 3: ")
    DelHeroNode(head, 3)
    ListHeroNode(head)
    fmt.Print("删除-> no = 4: ")
    DelHeroNode(head, 4)
    ListHeroNode(head)
}

本文来自:简书

感谢作者:_H_8f4a

查看原文:Golang单向链表

相关阅读 >>

聊聊dubbo-Go-proxy的apifilter

Golang吉祥物是啥?

Golang-cache是全局吗

关于Golang-import导入包语法

Golang开发中包的使用

Golang基础-高级数据结构

分享5种文件变更时自动重载Go程序的方法

在 bigcache 中存储任意类型(interface{})

Golang 语言的标准库 log 包怎么使用?

关于Golang Gopath的新用法

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...