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 ...
随机推荐
- TCP/IP协议第一卷第二章
环回接口: 127全网段均被作为环回地址. 传给广播地址或多播地址的数据报复制一份给环回接口,然后传送到以太网上.这是因为广播传送和多播传送的定义包含自己本身. 任何传给该主机IP地址的数据均送到环回 ...
- ubuntu 12 install redis
ubuntu 12 install redis 今天开始写数据server部分,大家初步的方案是用redis+mysql 所以要安装,下面记录安装的基本过程,留做后续参考 unbuntu 12 已经支 ...
- 【Spdy协议简介】
一.SPDY协议诞生记 SPDY (SPDY 是 Speedy 的昵音,意思是更快)是 Google 开发的基于传输控制协议 (TCP) 的应用层协议 ,那么为什么要搞一个SPDY出来呢?距离万维网之 ...
- 46 Linden Street ACT I
Execute me. My name is Richard Stewart. I’m a photographer. May I take a picture of you and your lit ...
- canvas绘制工作流之绘制节点
上一篇我们介绍了canvas绘制工作流的大概步骤,接下来会有系列文章细致的介绍怎么用canvas绘制工作流:这篇文章主要介绍用canvas绘制流程节点. 绘制前我们需要先准备一张节点图片,例如::好了 ...
- nginx跨域解决方案
nginx跨域解决方案Access to Font at 'http://47.104.86.187/yinjiatoupiao2/iconfont/iconfont.woff' from origi ...
- Jquery EasyUI 中ValidateBox验证框使用讲解
来源素文宅博客:http://blog.yoodb.com/ Validatebox(验证框)的设计目的是为了验证输入的表单字段是否有效.如果用户输入了无效的值,它将会更改输入框的背景颜色,并且显示警 ...
- Hazel,自动整理文件,让你的 Mac 井井有条
原文地址 https://sspai.com/post/35225 让我们从实际需求出发,看看问题出在哪里,并在此基础上认识和学习使用 Hazel. 电脑随着使用时间的增长,其中的文件也在疯狂的增长, ...
- java笔试面试第一天
好久未曾启用我的博客,最近来上海找工作,想将笔试面试的过程做个记录,毕竟有总结才有提高嘛.今天算是笔试面试正式开始第一天吧,以下就是我的笔试总结(没有原题了,只有知识点): 笔试题1:java sta ...
- 创建基于OData的Web API - Knowledge Builder API, Part III:Write Model
在前两篇文章<Part I: Business Scenario> 和<Part II: Project Setup>后,可以开始真正Model的创建. 步骤如下: 1. 创建 ...