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=%s\n", 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\n", backHead.ID, backHead.Name)
backHead = backHead.pre
if backHead.pre == head {
fmt.Printf("节点信息如下:id=%d,name=%s\n", 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: ,
Name: "宋江",
}
hero2 := &link.HerosNode{
ID: ,
Name: "李逵",
}
hero4 := &link.HerosNode{
ID: ,
Name: "林冲",
}
hero3 := &link.HerosNode{
ID: ,
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, )
link.FindHerosNode(head, )
link.ModifyHerosNode(head, , "我是修改后的英雄")
link.ForListHerosNode(head)
link.BackListHerosNode(head)
}
运行结果:
golang数据结构之双链表的更多相关文章
- Java 数据结构之双链表
package Linked; public class Mylinked { private Node first;//链表的第一个节点 private Node last;//链表的最后一个节点 ...
- golang数据结构之单链表
实现单链表的增删查改. 目录如下: singleLink.go package link import ( "fmt" ) //HeroNode 链表节点 type HeroNod ...
- 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- C# 数据结构 - 单链表 双链表 环形链表
链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...
- 深入理解Redis 数据结构—双链表
在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个 ...
- [C++11][数据结构]自己的双链表实现
这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式 ...
- 数据结构(C达到)------- 双链表
双链表中的每个节点包含两个指针域,指针域包含其后继节点的内存地址,还有一个指针所存储的存储器地址其领域前驱节点. 双向链表结点的类型描写叙述: //双向链表的类型描写叙述 typedef int El ...
- 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)
链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表. 一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...
- Python与数据结构[0] -> 链表/LinkedList[1] -> 双链表与循环双链表的 Python 实现
双链表 / Doubly Linked List 目录 双链表 循环双链表 1 双链表 双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指 ...
随机推荐
- Rsync实现文件的同步
故事背景:我们公司是做新零售的,需要对发布的每台机器进行文件的同步更新,所以我这里做了一个小小的调研 技术调研:linux之间同步文件有两种方式rsync与scp. sync和scp在文件夹均不存在时 ...
- [20191127]探究等待事件的本源4.txt
[20191127]探究等待事件的本源4.txt --//昨天使用ash_wait_chains.sql脚本把各个生产库执行1遍,才发现我对一套系统性能理解错误.--//我一直以为这套系统存储有点问题 ...
- log file sync等待超高案例浅析
监控工具DPA发现海外一台Oracle数据库服务器DB Commit Time指标告警,超过红色告警线(40毫秒左右,黄色告警是10毫秒,红色告警线是20毫秒),如下截图所示,生成了对应的时段的AWR ...
- shell编程之case分支语句
shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...
- 粗糙集理论(Rough Set Theory)
粗糙集理论(Rough Set Theory) 一种数据分析处理理论. <粗糙集—关于数据推理的理论>. 数据挖掘(Data Mining)和知识发现(KDD). 集合近似定义的基本思想及 ...
- 关于spring boot上手的一点介绍
在spring官网网址 https://spring.io/guides 下,有许多相关介绍,包括可以构建的例子程序. 使用intellij idea,可以通过新建 spring boot initi ...
- 使用原生代码实现一个Events模块,可以实现自定义事件的订阅、触发、移除功能
function Events() { // 放置所有添加的 监听事件 this._events = {} } Events.prototype = { on: function (name, fn, ...
- SpringBoot2.0 基础案例(16):配置Actuator组件,实现系统监控
本文源码 GitHub地址:知了一笑 https://github.com/cicadasmile/spring-boot-base 一.Actuator简介 1.监控组件作用 在生产环境中,需要实时 ...
- Java题库——Chapter1 计算机、程序和Java概述
1)________ is the physical aspect of the computer that can be seen. A)Hardware B) Operating system C ...
- oracle将时间加一天,加小时,加分,加秒
前言 oracle 时间类型可以直接相加,但加的是天,以天为单位,我们了解了这个,加一天,一小时,一分,一秒就都简单了. 加一天 select to_date('2019-08-15 22:03:10 ...