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

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

详情在代码中一一说明。

目录结构如下:

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. [考试反思]1015csp-s模拟测试74:压迫

    其实同时也是第27,一大片并列的. 真的是越考越烂. T1是个弱化的贪心原题,15分钟拿下没什么可说的. T2打的记忆化搜索,hash_mod太小撞哈希了,50->30 T3,想不到正解,90分 ...

  2. 【PyTorch教程】P3. Python学习中的两大法宝函数(当然也可以用在PyTorch)

    温馨提示:为了更好的教程体验,提供视频.阅读地址 Youtube: https://www.youtube.com/playlist?list=PLgAyVnrNJ96CqYdjZ8v9YjQvCBc ...

  3. WeihanLi.Npoi 近期更新

    WeihanLi.Npoi 近期更新 Intro 最近对我的 NPOI 扩展做了一些改变,一方面提高性能,一方面修复bug,增加一些新的功能来让它更加好用,前几天发布了 1.5.0 版本,下面来介绍一 ...

  4. 一份自用的webpack配置文件及其配置说明

    1.webpack.config.js const path = require('path') const HtmlWebpackPlugin = require('html-webpack-plu ...

  5. 『题解』洛谷P1993 小K的农场

    更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...

  6. 1114作业 html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. [LINQ2Dapper]最完整Dapper To Linq框架(七)---仓储模式

    目录 [LINQ2Dapper]最完整Dapper To Linq框架(一)---基础查询 [LINQ2Dapper]最完整Dapper To Linq框架(二)---动态化查询 [LINQ2Dapp ...

  8. JavaScript中BOM与DOM的使用

    BOM: 概念:Browser Object Model 浏览器对象模型 将浏览器的各个组成部分封装成对象. 组成: Window:窗口对象 Navigator:浏览器对象 Screen:显示器屏幕对 ...

  9. [UWP]使用Win2D的BorderEffect实现图片的平铺功能

    1. WPF有,而UWP没有的图片平铺功能 在WPF中只要将ImageSource的TileMode属性设置为Tile即可实现图片的平铺,具体可见WPF的这些文档: ImageBrush 类 (Sys ...

  10. VS2019打包WPF安装程序最新教程

    VS2019打包WPF安装程序最新教程,使用Visual Studio 2019开发的WPF程序如果想要打包为安装程序,除了在VS2019找到WPF项目类库直接右键发布之外,更常用的还是将其打包为ex ...