目录结构:

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数据结构之双链表的更多相关文章

  1. Java 数据结构之双链表

    package Linked; public class Mylinked { private Node first;//链表的第一个节点 private Node last;//链表的最后一个节点 ...

  2. golang数据结构之单链表

    实现单链表的增删查改. 目录如下: singleLink.go package link import ( "fmt" ) //HeroNode 链表节点 type HeroNod ...

  3. 数据结构图文解析之:数组、单链表、双链表介绍及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  4. C# 数据结构 - 单链表 双链表 环形链表

    链表特点(单链表 双链表) 优点:插入和删除非常快.因为单链表只需要修改Next指向的节点,双链表只需要指向Next和Prev的节点就可以完成插入和删除操作. 缺点:当需要查找某一个节点的时候就需要一 ...

  5. 深入理解Redis 数据结构—双链表

    在 Redis 数据类型中的列表list,对数据的添加和删除常用的命令有 lpush,rpush,lpop,rpop,其中 l 表示在左侧,r 表示在右侧,可以在左右两侧做添加和删除操作,说明这是一个 ...

  6. [C++11][数据结构]自己的双链表实现

    这个双链表,是我模仿stl的list制作的,只实现了一些基本功能,像merge,transfer这些就没有实现,用户可以用基本操作来自己做外部实现. 我没有选用stl的[begin,end)迭代器模式 ...

  7. 数据结构(C达到)------- 双链表

    双链表中的每个节点包含两个指针域,指针域包含其后继节点的内存地址,还有一个指针所存储的存储器地址其领域前驱节点. 双向链表结点的类型描写叙述: //双向链表的类型描写叙述 typedef int El ...

  8. 数据结构与算法之PHP实现链表类(单链表/双链表/循环链表)

    链表是由一组节点组成的集合.每个节点都使用一个对象的引用指向它的后继.指向另一个节点的引用叫做链表. 链表分为单链表.双链表.循环链表.   一.单链表 插入:链表中插入一个节点的效率很高.向链表中插 ...

  9. Python与数据结构[0] -> 链表/LinkedList[1] -> 双链表与循环双链表的 Python 实现

    双链表 / Doubly Linked List 目录 双链表 循环双链表 1 双链表 双链表和单链表的不同之处在于,双链表需要多增加一个域(C语言),即在Python中需要多增加一个属性,用于存储指 ...

随机推荐

  1. 斐波那契数列(Java)

    一.什么是斐波那契数列 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为& ...

  2. import com.sun.org.apache.xml.internal.security.utils.Base64问题

    ———————————————— 版权声明:本文为CSDN博主「荚小白」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csd ...

  3. QT QSplitter设置初始比例setStretchFactor失效解决

    QSplitter如下为常用 设置显示比例 pRightSplitter=new QSplitter(Qt::Vertical); pRightSplitter->setMouseTrackin ...

  4. 学java可以做些什么

    学java可以做些什么 对于很多新手来说,刚开始接触Java会很迷惘,不知道Java可以做什么.其实Java 可以做的东西太多了,手机游戏.中间件.软件.网站,电脑游戏,以及现在流行的安卓手机app等 ...

  5. PanDownload

    百度盘下载地址:下载速度很快(链接)

  6. 阿里云搭建wordpress博客教程

    一 :搭建环境 1.安装Apache环境 在线安装Apache yum install httpd 启动Apache服务 service httpd start 设置开机自启动 chkconfig h ...

  7. swoole为什么不能代替nginx

    Swoole不能代替Apache和Nginx这些通用的HTTP服务器. 但基于Swoole开发的PHP应用不依赖Apache和Nginx也能提供生产级别的HTTP服务. 有需要学习交流的友人请加入交流 ...

  8. 如何在动态链接库dll/so中导出自定义的模板类template class | how to implement a template class with c++ and export in dll/so

    本文首发于个人博客https://kezunlin.me/post/4ec4ae49/,欢迎阅读最新内容! how to implement a template class with c++ and ...

  9. 微信小程序之左右布局

    本文以一个简单的小例子,简述在微信小程序开发中左右布局功能的实现方式,主要涉及scroll-view ,列表数据绑定,及简单样式等内容,仅供学习分享使用. 概述 在微信小程序开发中,左右分栏(左边显示 ...

  10. 【LeetCode】6. Z 字形变换

    题目 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L   C   ...