golang数据结构之双链表

摘要:
目录结构:doubleLink Gopackagelinkimport(“fmt”)//HerosNode链接列表节点类型HerosNodestruct{IDintNamestringpre*HerosNode//pointer next*HerosNode//pointer}//InsertHerosNode插入函数InsertHerosNode*(head*HerosNode,newHerosNode*Heros

目录结构:

golang数据结构之双链表第1张

 doubleLink.go

package link

import (
    "fmt"
)

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

//InsertHerosNode 插入
func InsertHerosNode(head *HerosNode, newHerosNode *HerosNode) {
    tmp := head
    for {
        if tmp.next == nil {
            break
        }
        tmp = tmp.next
    }
    tmp.next = newHerosNode
    newHerosNode.pre = tmp
}

//InsertHerosNodeByID 根据id从小到大插入
func InsertHerosNodeByID(head *HerosNode, newHerosNode *HerosNode) {
    tmp := head

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

}

//DeleteHerosNode 删除
func DeleteHerosNode(head *HerosNode, 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
                tmp2.pre = tmp
            }
            break
        } else {
            tmp = tmp.next
        }
    }
}

//FindHerosNode 查找
func FindHerosNode(head *HerosNode, 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
        }
    }
}

//ModifyHerosNode 修改
func ModifyHerosNode(head *HerosNode, 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
        }
    }
}

//ForListHerosNode 显示信息
func ForListHerosNode(forHead *HerosNode) {
    fmt.Println("正向打印所有信息")
    tmp := forHead
    if tmp.next == nil {
        fmt.Println("链表为空")
        return
    }
    for {
        fmt.Printf("节点信息如下:id=%d,name=%s
", tmp.next.ID, tmp.next.Name)
        tmp = tmp.next
        if tmp.next == nil {
            fmt.Println("已显示所有信息")
            break
        }
    }
}

//BackListHerosNode 显示信息
func BackListHerosNode(head *HerosNode) {
    fmt.Println("----------------------")
    fmt.Println("反向打印所有信息")
    tmp := head
    if tmp.next == nil {
        fmt.Println("链表为空")
        return
    }
    var backHead *HerosNode
    for {
        tmp = tmp.next
        if tmp.next == nil {
            backHead = tmp
            break
        }
    }
    for {
        fmt.Printf("节点信息如下:id=%d,name=%s
", backHead.ID, backHead.Name)
        backHead = backHead.pre
        if backHead.pre == head {
            fmt.Printf("节点信息如下:id=%d,name=%s
", backHead.ID, backHead.Name)
            fmt.Println("已显示所有信息")
            break
        }
    }
}

main.go

package main

import "go_code/data_structure/link"

func main() {

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

    link.InsertHerosNodeByID(head, hero2)
    link.InsertHerosNodeByID(head, hero1)
    link.InsertHerosNodeByID(head, hero4)
    link.InsertHerosNodeByID(head, hero3)
    link.DeleteHerosNode(head, 3)
    link.FindHerosNode(head, 4)
    link.ModifyHerosNode(head, 4, "我是修改后的英雄")
    link.ForListHerosNode(head)
    link.BackListHerosNode(head)
}

运行结果:

golang数据结构之双链表第2张

免责声明:文章转载自《golang数据结构之双链表》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇从程序员到项目经理(11):每个人都是管理者LaTeX 中列表环境的使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Golang的异常处理实战篇

          Golang的异常处理实战篇                              作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。       Go语言的异常捕获要比Python中简单的多,它没有Python中那么多复杂的异常类型及继承体系。接下来我们来一起体验一下Golang的异常处理。     一.代码运行时出...

内存池技术的原理与实现

6.1 自定义内存池性能优化的原理  如前所述,读者已经了解到"堆"和"栈"的区别。而在编程实践中,不可避免地要大量用到堆上的内存。例如在程序中维护一个链表的数据结构时,每次新增或者删除一个链表的节点,都需要从内存堆上分配或者释放一定的内存;在维护一个动态数组时,如果动态数组的大小不能满足程序需要时,也要在内存堆上分配新的内存空间。 6.1.1 默认内存管...

闲话缓存:ZFS 读缓存深入研究-ARC(一)

在Solaris ZFS 中实现的ARC(Adjustable Replacement Cache)读缓存淘汰算法真是很有意义的一块软件代码。它是基于IBM的Megiddo和Modha提出的ARC(Adaptive Replacement Cache)淘汰算法演化而来的。但是ZFS的开发者们对IBM 的ARC算法做了一些扩展,以更适用于ZFS的应用场景。...

golang 日志框架(zap)完整配置和使用

目录结构: logger.go文件: package log import ( rotatelogs "github.com/lestrrat-go/file-rotatelogs" "go.uber.org/zap" "go.uber.org/zap/zapcore" "io" "os" "time"...

11 libubox

1 libubox 主要提供事件循环,二进制块格式处理、linux链表实现和一些JSON辅助主要包含3个软件包:libubox、jshn、libblobmsg-json 1.1 libubox 1、提供多种基础通用功能接口。如:链表、平衡二叉树、二进制块处理、MD5等2、提供多种sock接口封装3、提供事件驱动机制及任务管理功能 utils.h...

HashMap之原理及死锁

一、HashMap原理 1.HashMap的本质就是数组和链表。table是一个entry数组,每一个数组元素保存一个Entry节点,而Entry节点内部又连接着同样key的下一个Entry节点,就构成了链表。. 详情见 HashMap源码分析 2.HashMap死锁原因: HashMap会造成死锁,因为HashMap是线程非安全的,多并发的情况...