golang数据结构之双链表
时间:2022-07-23
本文章向大家介绍golang数据结构之双链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
目录结构:
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的节点n", 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=%sn", 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=%sn", backHead.ID, backHead.Name)
backHead = backHead.pre
if backHead.pre == head {
fmt.Printf("节点信息如下:id=%d,name=%sn", 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)
}
运行结果:
- centos系统安装Python
- rpc框架之 thrift连接池实现
- .NET Core全新路线图
- jboss eap 6.2+ 版本中 加密datasource密码等敏感信息
- WordPress自定义栏目运用实例II:添加文章Meta标签(keywords /description)
- 《Deep Learning with Python》第一章 1.1 人工智能、机器学习和深度学习
- boost::function的用法
- rpc框架之 thrift 学习 1 - 安装 及 hello world
- WordPress自定义栏目运用实例Ⅰ:添加文章来源
- ZooKeeper 笔记(5) ACL(Access Control List)访问控制列表
- 算法:支持重复元素的二分查找
- .NET 异常处理的动作策略(Action Policy)
- 如何在mac本上安装android sdk
- Fityk-曲线拟合工具
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ChartCenter ——为您的K8s之旅保驾护航v
- leetcode链表之删除链表的节点
- iOS打包的那一些事情
- 腾讯云服务器(CentOS 7、Tencent Linux)手动搭建LNMP环境(linux+Nginx+Mariadb+PHP)
- iOS技术面试题及答案
- 虽然现在有可以去码的软件了,可视频是如何自动跟踪打码的?
- 2020-09-12:手撕代码:最小公倍数,复杂度多少?
- Mac App推荐
- 美团面试问ThreadLocal,学妹一口气给他说了四种!
- BFE.dev前端刷题#108. 用队列(Queue)实现栈(Stack)
- Kafka消费过程关键源码解析
- leetcode链表之两个链表的第一个公共节点
- 测试开发基础 mvn test | 利用 Maven Surefire Plugin 做测试用例基础执行管理
- 腾讯云Elasticsearch集群规划及性能优化实践
- 【赵渝强老师】在MongoDB中使用MapReduce方式计算聚合