golang数据结构之循环链表
循环链表还是挺有难度的:
- 向链表中插入第一条数据的时候如何进行初始化。
- 删除循环链表中的数据时要考虑多种情况。
详情在代码中一一说明。
目录结构如下:

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数据结构之循环链表的更多相关文章
- golang数据结构之用循环链表解决约瑟夫环问题
josephu.go package link import ( "fmt" ) type Kid struct { ID int next *Kid } func AddKid( ...
- golang数据结构之总结
golang语言的一些数据结构实现,包括: 队列(单队列.循环队列) 链表(单链表.双链表.循环链表(解决约瑟夫环问题)) 栈(实现加减乘除计算) 递归之迷宫问题 哈希表(员工管理系统) 树(三种遍历 ...
- golang数据结构和算法之BinarySearch二分查找法
基础语法差不多了, 就需要系统的撸一下数据结构和算法了. 没找到合适的书, 就参考github项目: https://github.com/floyernick/Data-Structures-and ...
- JavaScript数据结构-9.循环链表
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 【数据结构】循环链表&&双向链表详解和代码实例
喜欢的话可以扫码关注我们的公众号哦,更多精彩尽在微信公众号[程序猿声] 01 循环链表 1.1 什么是循环链表? 前面介绍了单链表,相信大家还记得相关的概念.其实循环链表跟单链表也没有差别很多,只是在 ...
- 数据结构7: 循环链表(约瑟夫环)的建立及C语言实现
链表的使用,还可以把链表的两头连接,形成了一个环状链表,称为循环链表. 和它名字的表意一样,只需要将表中最后一个结点的指针指向头结点,就形成了一个环. 图1 循环链表 循环链表和动态链表相比,唯一的不 ...
- Golang 数据结构
每种语言在实现数据结构有些许不同.go 是如何实现的呢? 1. 数组 Array go 中数组是相同的元素组成的集合,计算机会为数组分配一段连续的内存来保存元素,可以利用索引快速访问元素. go 中数 ...
- golang数据结构之队列
队列可以用数组或链表实现,遵从先入先出. 目录结构: 在main中调用queue包中的属性和方法,如何调用参考另一篇文章: https://www.cnblogs.com/xiximayou/p/12 ...
- golang数据结构之树的三种遍历方式
tree.go package tree import ( "fmt" ) type TreeNode struct { ID int Val int Left *TreeNode ...
随机推荐
- Ubuntu18.04 安装MySQL(Linux)解决登陆权限问题及Navicat for mysql 中文乱码问题
一.MySQL(Linux)解决登陆权限问题 Ubuntu18.04 安装mysql或者mariadb之后,发现普通用户和远程都没有权限连接. ERROR 1045: Access denied fo ...
- NOIP模拟 11
差点迟到没赶上开题 开题后看了T1,好像一道原题,没分析复杂度直接敲了个NC线段树,敲了个暴力,敲了个对拍,就1h了.. 对拍还对出错了,发现标记下传有点问题,改了以后对拍通过,就把T1扔掉看T2 觉 ...
- 《吊打面试官》系列-Redis终章_凛冬将至、FPX_新王登基
你知道的越多,你不知道的越多 点赞再看,养成习惯 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难.作为一个在互联 ...
- Centos 7.X 安装及常规设置
一.制作USBHDD+启动 需要工具: UltraISO(软碟通) U盘 centos7镜像: http://www.centos.org 二.安装(有坑) U盘启动电脑,进入安装界面: 选中第一项, ...
- 【持续更新】【pat】pat刷题技巧记录
修改code completion快捷键位CTRL+ENTER,帮助提示函数名称 修改命令行提示符的属性,开启快速编辑模式,方便调试 添加c++11语言标准支持 开启代码调试功能 对输入的字符串进行切 ...
- ubantu14.04安装storm伪分布式
1.安装jdk 安装:sudo apt-get install openjdk-7-jdk 配置: 修改文件 sudo nano /etc/profile , 添加以下内容: 立即执行使之生效: 2. ...
- nyoj 845-无主之地1 (struct)
845-无主之地1 内存限制:64MB 时间限制:1000ms 特判: No 通过数:8 提交数:16 难度:0 题目描述: 子晓最近在玩无主之地1,他对这个游戏的评价不错,结合了FPS与RPG元素, ...
- 领扣(LeetCode)第三大的数 个人题解
给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...
- 源码分析RocketMQ消息轨迹
目录 1.发送消息轨迹流程 1.1 DefaultMQProducer构造函数 1.2 SendMessageTraceHookImpl钩子函数 1.3 TraceDispatcher实现原理 2. ...
- python进程池与线程池
为什么会进行池化? 一切都是为了效率,每次开启进程都会分配一个属于这个进程独立的内存空间,开启进程过多会占用大量内存,系统调度也会很慢,我们不能无限的开启进程. 进程池原来大概如下图 假设有100个任 ...