一、什么是循环链表

循环链表的节点形成一个圈。把单链表的尾巴指向开头形成单循环链表。把双向链表的尾巴与开头链接起来就形成双向循环链表。使用循环链表可以不断的绕圈寻找所需要的数据,而不需要像单链表那样每次都从开头开始寻找,可以提高查询的效率。

今天大卫哥先实现一个单向循环链表,双向循环链表的实现就交给大家了。

二、单向循环链表的Go实现

1、节点

单向循环链表的节点和单链表的实现是类似的,不过为了区别,我们取了不同名字。

    type CNode struct {data Objectnext *CNode}

2、单向循环链表

单向循环链表车队由5节车厢组成,1号车是车头。为了表示这种关系,大卫哥用下面的结构体来承载。

    type CList struct {size uint64    // 车厢数量head *CNode    // 车头}

三、接口说明及实现

1、Init初始化

大卫哥是个干脆的人,初始化的理由直接看前面几节。这次直接上代码。

    func (cList *CList) Init() {lst := *cListlst.size = 0    // 没车厢lst.head = nil  // 没车头}

2、Append添加数据

将数据添加到链表的尾部。

    func (cList *CList) Append(data Object) bool {node := new(CNode)(*node).data = data   // 安排一个新车厢,装上dataif cList.GetSize() == 0 {(*cList).head = node  // 第一辆车,直接作为车头} else {item := cList.GetHead() // 找到车尾for ; (*item).next != cList.GetHead(); item = (*item).next {}(*item).next = node // 把新车厢挂到车尾}(*node).next = (*cList).head // 车尾再挂上车头(*cList).size++return true}

3、InsertNext节点后面插入数据

在当前节点的后面,插入新的节点。

    func (cList *CList) InsertNext(elmt *CNode, data Object) bool {if elmt == nil {return false}node := new(CNode)    // 安排一个新车厢,装上data(*node).data = data(*node).next = (*elmt).next // elmt后面车厢,挂在新车厢后面(*elmt).next = node  // elmt后面挂上新车厢(cList).size++return true}

4、Remove删除节点

    func (cList *CList) Remove(elmt *CNode) Object {if elmt == nil {return false}item := cList.GetHead() // 找到elmt的前面一节车厢for ; (*item).next != elmt; item = (*item).next {}(*item).next = (*elmt).next // 将前面一节车厢的绳索直接挂到后面一节车厢(*cList).size--return elmt.GetData()  // 返回elmt车厢装的货物}

5、GetHead获取链表开头

    func (cList *CList) GetHead() *CNode {return (*cList).head}

6、GetSize获取链表节点数量

    func (cList *CList) GetSize() uint64 {return (*cList).size}

7、GetData获取节点装的数据

GetData是节点的方法,获取车厢里装的货物。func (node *CNode) GetData() Object {return (*node).data}

8、GetNext获取下一个节点
和GetData一样是节点的方法,用于获取下一个车厢。

    func (node *CNode) GetNext() *CNode {return (*node).next}

代码下载

四、小结

链表内容就此结束了,下面一章大卫哥将讲讲栈和队列,大卫哥将用链表实现。

转载于:https://www.cnblogs.com/lanrenji/p/9691265.html

第三节 循环链表的Go语言实现相关推荐

  1. 数据结构无头结点单向不循环链表(C语言版)

    main.c(负责测试) #include <stdlib.h> #include <stdio.h> #include <time.h> #include &qu ...

  2. 线性表:6.双向链表,可构成双向循环链表和C语言实现

    之前接触到的链表都只有一个指针,指向直接后继,整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 "单向链表"或"单链表". 如果算法中需要频繁地找某结点 ...

  3. 线性表:5.约瑟夫环,循环链表及其C语言实现

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

  4. c语言怎么创建循环链表,纯C语言实现循环双向链表创建,插入和删除

    #include #includetypedefintElemType; typedefstructDLNode{ ElemType data;struct DLNode *next;struct D ...

  5. 数据结构带头结点单向不循环链表(C语言版)

    main.c,负责测试 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include<stdlib.h> #inc ...

  6. 单向循环链表的简单实现

    单向循环链表:       在单向链表中,头指针是相当重要的,因为单向链表的操作都需要头指针,所以如果头指针丢失或者破坏,那么整个链表都会遗失,并且浪费链表内存空间. 单向循环链表的构成:       ...

  7. LeetCode--3. 无重复字符的最长子串(双指针)

    无重复字符的最长子串(C) 1. 题目描述 2. 题目分析 3. C语言实现 1. 题目描述 难度:中等 2. 题目分析 这道题目是一道中等难度的题目,我们需要知道的有一点: 字符串中有包括空字符的所 ...

  8. 数据结构:八大数据结构学习总篇章

    文章目录 0 引言 1 数组(Array) 2 链表(Linked List) 3 树(Tree) 4 队列(Queue) 5 栈(Stack) 6 堆(Heap) 7 散列表(Hash) 8 图(G ...

  9. j2se培训第一天内容

    第一天授课内容 第一节课 1.学习方式 1 记笔记 写总结 2 对程序进行详细注释说明 2 解决问题 1 求帮助途径错误 2不要依赖视频与书籍. 3心态问题 a 攀比 b 遇到问题走了死胡同 c 遇到 ...

最新文章

  1. Mysql中S 锁和 X 锁的区别
  2. User Profile Service 服务未能登录转载自(sailing的新浪博客)
  3. PMP-【第1章 引论】-2020-12-07(18页-24页)
  4. Linux 下 pmap 命令的使用
  5. 地址总线是单向还是双向_三端双向交流开关(TRIAC)
  6. python读取tiff数据_opencv-python读取tiff影像,并展示
  7. BugkuCTF-MISC题可爱的故事
  8. php smarty2 框架,PHP CodeIngiter 2.x.x 框架与 Smarty 3.x.x 模板引擎整合
  9. azure api 管理_使用API​​使用Azure Cosmos DB进行图形数据库实现
  10. python读写文件函数_Python开发【第三篇】:函数读写文件
  11. Gse v0.40.0 发布,Go 高性能分词,增加更多常用 API
  12. [Step By Step]SAP HANA PAL多元线性回归预测分析Linear Regression实例FORECASTWITHLR(预测)...
  13. Spring映射器、适配器、解析器
  14. 新旧_飘云羽逸_新浪博客
  15. 小猪佩奇粉红猪 成年人重新拾起英文笔记
  16. F-Groundhog Looking Dowdy2020牛客暑期多校训练营(第九场)(尺取法)
  17. 广州“粤A000F1”车牌拍出74万天价(图)
  18. 详解AES对称加密(python实现文件加密)
  19. tcp协议一定要有服务器吗,复习TCP协议——看这篇就够了
  20. ASMEDIA祥硕 PCIe与SATA控制芯片

热门文章

  1. 参加Google™ Code Jam - 中国编程挑战赛(2)
  2. Ubuntu 18.0.4 安装Selenium 详细流程(亲测有效)
  3. js实现给a href= href赋值
  4. Django系列之启动入口源码分析
  5. Linq to SQL -- Select、Distinct和Count、Sum、Min、Max、Avg
  6. 当你再面对大多数需求时能够说这些问题我以前做过,那你就。。。
  7. Atitit. atiJavaExConverter4js  新的特性
  8. Memcached原理分析
  9. Posix多线程编程—线程属性
  10. 封装事件绑定函数解决this在ie下的绑定问题