循环链表还是挺有难度的:

  • 向链表中插入第一条数据的时候如何进行初始化。
  • 删除循环链表中的数据时要考虑多种情况。

详情在代码中一一说明。

目录结构如下:

circleLink.go

package link

import (
"fmt"
) type CatNode struct {
ID int
Name string
next *CatNode
} func InserCatNode(head *CatNode, newCatNode *CatNode) {
//初始化链表
//头结点一开始是空的,当插入第一条数据时,进行初始化
if head.next == nil {
head.ID = newCatNode.ID
head.Name = newCatNode.Name
head.next = head
return
}
//定义一个临时变量,找到环形的末尾,方便以后进行插入
tmp := head
for {
if tmp.next == head {
tmp.next = newCatNode
newCatNode.next = head
break
} else {
tmp = tmp.next
}
}
} func DeleteCatNode(head *CatNode, id int) *CatNode {
//建立一个节点指向头结点
tmp := head
//如果头结点.next为空,说明是空链表
if tmp.next == nil {
fmt.Println("空链表")
return head
}
//如果头结点.next就是它自己,说明只有一个元素
if tmp.next == head {
//判断该元素是否是要删除的,如果是,则将头结点置为空
if tmp.ID == id {
head.next = nil
return head
} else {
fmt.Println("要删除的id不存在")
}
}
//奖励一个辅助指针指向头结点
helper := head
//如果头结点正好是我们要删除的
if tmp.ID == id {
fmt.Println("进入1")
//如果头结点.next不是指向它自己,说明除了头结点之外还存在其它节点
if tmp.next != head {
fmt.Println("进入2")
//此时若想删除头结点,我们必须获得一个新的头结点
tmp = head.next
//将helper遍历到头结点的前一位
for {
if helper.next != head {
helper = helper.next
} else {
//同时删除掉原来的头结点
fmt.Println("进入3")
helper.next = head.next
return tmp
}
}
} else {
//说明只有一个头结点,且是我们要删除的,直接将其置为空
tmp.next = nil
}
//如果头结点不是我们要删除的
} else {
for {
//如果找到一个节点是我们要删除的
if tmp.next.ID == id {
//删除该节点
tmp2 := tmp.next
tmp.next = tmp2.next
break
//如果找不到则继续遍历下一个节点
} else {
tmp = tmp.next
//如果下一个节点是头结点,则表明完成遍历,找不到要删除的节点,并退出
if tmp.next == head {
fmt.Println("未找到该条记录")
break
}
}
}
} return head
} func ListCatNode(head *CatNode) {
tmp := head
if tmp.next == nil {
fmt.Println("空环形链表")
return
}
for {
fmt.Printf("猫的信息为:id=%d,name=%s\n", tmp.ID, tmp.Name)
if tmp.next == head {
break
} else {
tmp = tmp.next
} } }

main.go

package main

import (
"fmt"
"go_code/data_structure/link"
) func main() { head := &link.CatNode{}
cat1 := &link.CatNode{
ID: ,
Name: "tom",
}
cat2 := &link.CatNode{
ID: ,
Name: "jack",
}
cat3 := &link.CatNode{
ID: ,
Name: "bob",
}
cat4 := &link.CatNode{
ID: ,
Name: "mike",
} link.InserCatNode(head, cat1)
link.InserCatNode(head, cat2)
link.InserCatNode(head, cat3)
link.InserCatNode(head, cat4)
link.ListCatNode(head)
fmt.Println("------------------------------")
fmt.Println("删除id=1后的结果是:")
h1 := link.DeleteCatNode(head, )
link.ListCatNode(h1)
fmt.Println("------------------------------")
fmt.Println("删除id=4后的结果是:")
h2 := link.DeleteCatNode(h1, )
link.ListCatNode(h2)
fmt.Println("------------------------------")
fmt.Println("删除id=3后的结果是:")
h3 := link.DeleteCatNode(h2, )
link.ListCatNode(h3)
fmt.Println("------------------------------")
fmt.Println("删除id=2后的结果是:")
h4 := link.DeleteCatNode(h3, )
link.ListCatNode(h4)
}

运行结果:

golang数据结构之循环链表的更多相关文章

  1. golang数据结构之用循环链表解决约瑟夫环问题

    josephu.go package link import ( "fmt" ) type Kid struct { ID int next *Kid } func AddKid( ...

  2. golang数据结构之总结

    golang语言的一些数据结构实现,包括: 队列(单队列.循环队列) 链表(单链表.双链表.循环链表(解决约瑟夫环问题)) 栈(实现加减乘除计算) 递归之迷宫问题 哈希表(员工管理系统) 树(三种遍历 ...

  3. golang数据结构和算法之BinarySearch二分查找法

    基础语法差不多了, 就需要系统的撸一下数据结构和算法了. 没找到合适的书, 就参考github项目: https://github.com/floyernick/Data-Structures-and ...

  4. JavaScript数据结构-9.循环链表

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  5. 【数据结构】循环链表&&双向链表详解和代码实例

    喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 循环链表 1.1 什么是循环链表? 前面介绍了单链表,相信大家还记得相关的概念.其实循环链表跟单链表也没有差别很多,只是在 ...

  6. 数据结构7: 循环链表(约瑟夫环)的建立及C语言实现

    链表的使用,还可以把链表的两头连接,形成了一个环状链表,称为循环链表. 和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,就形成了一个环. 图1 循环链表 循环链表和动态链表相比,唯一的不 ...

  7. Golang 数据结构

    每种语言在实现数据结构有些许不同.go 是如何实现的呢? 1. 数组 Array go 中数组是相同的元素组成的集合,计算机会为数组分配一段连续的内存来保存元素,可以利用索引快速访问元素. go 中数 ...

  8. golang数据结构之队列

    队列可以用数组或链表实现,遵从先入先出. 目录结构: 在main中调用queue包中的属性和方法,如何调用参考另一篇文章: https://www.cnblogs.com/xiximayou/p/12 ...

  9. golang数据结构之树的三种遍历方式

    tree.go package tree import ( "fmt" ) type TreeNode struct { ID int Val int Left *TreeNode ...

随机推荐

  1. 对pwntools生成的exp模版做了一些修改

    安装pwntools后,有一些命令行的工具可以用 ~ pwn template -h usage: pwn template [-h] [--host HOST] [--port PORT] [--u ...

  2. 使用Typescript重构axios(二十一)——请求取消功能:添加axios.isCancel接口

    0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...

  3. 大数据之路week01--自学之集合_2(Iterator迭代器)

    选代器:是遍历集合的一种方式.迭代器是依赖于集合而存在的.我有一个集合: Collection c = new ArrayList();我们给集合中添加元素: c. add("hello' ...

  4. 『题解』洛谷P5015 标题统计

    题意描述 给你一个字符串,求所有字符的总数. 字符只包含数字,大小写字母. 分析 字符串的长度还是\(\le5\)的. 直接枚举就可以了. AC代码: NOIP官方标准程序是这样的 #include ...

  5. Python基础学习(一)之Python的概述与环境安装

    Python介绍 Python语言介绍 Python是一门高级的.面向对象的.解释性.脚本语言. 高级语言:贴近开发者,对应底层语言,底层语言贴近机器:java.C#.php .ruby 面向对象对应 ...

  6. 通过cmd命令查看Python库、函数和模块的帮助文档与介绍

    dir函数式可以查看对象的属性 使用方法很简单,举os类型为例,在Python命令窗口输入 dir(‘os’) 即可查看os模块的属性 打开cmd命令窗口 输入python(注意:计算机需要有Pyth ...

  7. javascript 解决默认取整的坑(目前已知的最佳解决方案)

    javascript 解决默认取整的坑(目前已知的最佳解决方案) 复现该问题 js在数字操作时总会取更高精度的结果,例如1234/10结果就是123.4,但是在c或者java中整数除以10的结果还是整 ...

  8. Mybatis精讲(二)---生命周期

    目录 回顾 SqlSessionFactoryBuilder SqlSessionFactory openSessionFromDataSource Executor SqlSession Mappe ...

  9. .NET Core 获取数据库上下文实例的方法和配置连接字符串

    目录 .NET Core 获取数据库上下文实例的方法和配置连接字符串 ASP.NET Core 注入 .NET Core 注入 无签名上下文 OnConfigure 配置 有签名上下文构造函数和自己n ...

  10. PostgreSQL空间数据库创建备份恢复(PostGIS vs ArcGIS)

    梯子 PostGIS创建备份恢复ArcGIS创建备份恢复 PostGIS 创建 安装就不必介绍了,windows下使用安装工具Application Stack Builder,选择空间扩展PostG ...