循环链表之简介

循环链表是另一种形式的链表,他的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。由此,从表中任一结点出发均可找到表中其他节点。

循环链表的结构图如下:

循环链表的操作和之前的写过的单链表的操作是基本一致的,所以我就不再给出详细的代码,我来说说它们之间的不同:循环链表与单链表的差别在于算法之中的循环条件不是p或者p->next 是否为空,而变成了它们是否等于头指针。

循环链表的特点是无需增加存储量,仅对链接的方式稍作改变,即可使得表处理更加方便灵活。

我们同样找一个例子来说明这个特点:

例如我们在链表上实现将两个线性表(a1,a2,…,an) 和 (b1,b2,…,bn)连接成一个线性表(a1,a2,…,an,b1,b2,…,bn)的预算。

我们如果在单链表上做这种链接操作,我们都需要遍历链表a,首先找到节点an,将b1链接到an的后面,它的复杂度是O(n)。但是如果我们在尾指针表示的单循环表上实现,只需要修改指针,不需要遍历,它的复杂度是O(1)。

这样用尾指针表示的循环链表的示意图如下

我们在实验中通常是用尾指针表示的循环链表,这是因为我们只要找到了尾指针,它的下一个便是头指针,这就相当于我们找到了头指针,但如果我们用头指针表示的循环链表,那么我们如果需要尾指针,我们必须要遍历整个链表。

时间: 2024-10-12 16:54:25

循环链表之简介的相关文章

List ArrayList LinkedList vector简介与区别

ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,但它们有各自不同的特性,主要如下: ArrayList:底层用数组实现的List 特点:查询效率高,增删效率低 轻量级 线程不安全 LinkedList:底层用双向循环链表 实现的List 特点:查询效率低,增删效率高 Vector: 底层用数组实现List接口的另一个类 特点:重量级,占据更多的系统开销 线程安全 一.同步性 ArrayList,LinkedList是不同步的,而Vestor

十四、循环链表的实现

1.循环链表简介 概念上: 任意数据元素都有一个前驱和一个后继 所有的数据元素的关系构成一个逻辑上的环 实现上: 循环链表是一种特殊的单链表 尾结点的指针域保存了首结点的地址 循环链表的继承层次结构 2.循环链表的实现思路 通过模板定义CircleList类,继承自LinkList类 定义内部函数last_to_first(),用于将单链表首尾相连 特殊处理:首元素的插入操作和删除操作 重新实现:清空操作和遍历操作 循环链表的实现要点: 插入位置为0时:插入的结点成为首结点 头结点和尾结点均指向

数据结构与算法(四)-线性表之循环链表

前言:前面几篇介绍了线性表的顺序和链式存储结构,其中链式存储结构为单向链表(即一个方向的有限长度.不循环的链表),对于单链表,由于每个节点只存储了向后的指针,到了尾部标识就停止了向后链的操作.也就是说只能向后走,如果走过了,就回不去了,还得重头开始遍历,所以就衍生出了循环链表 一.简介 定义:将单链表中中断结点的指针端有空指针改为指向头结点,就使整个单链表形成一个环,这种头尾详解的单链表称为单循环链表,简称循环链表: 特性: 若链表为空,则头结点的next结点还是指向其本身,即head.next

用循环链表解决约瑟夫环的问题

约瑟夫环问题简介 约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,直到所有人全部出圈为止.当任意给定n和m后,设计算法求n个人出圈的次序.  稍微简化一下. 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 解题思路 将每个人的编号作为结点值,因为报数是循环着来的,故可

数据结构总结系列(三)——循环链表之约瑟夫问题

约瑟夫问题简介: 约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉.例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1. 分析: (1)由于对于每个人只有死和活两种状态,因此可以用布朗型数组标记每个人的状态,可用true表示死,false表示活. (2)开始时每个人都是活的,所以数组初值全部赋为false. (3)模拟杀人过程,直到所有人都被杀死为止. (由于博主懒癌犯了导致随便截取了某度百科的内容,或许更新之后会用这种方法呢~~

Android网络通讯简介

网络通信应该包含三部分的内容:发送方.接收方.协议栈.发送方和接收方是参与通信的主体,协议栈是发送方和接收方进行通信的契约.按照服务类型,网络通信可分为面向连接和无连接的方式.面向连接是在通信前建立通信链路,而通信结束后释放该链路.无连接的方式则不需要在通信前建立通信连接,这种方式不保证传输的质量. Android提供了多种网络通信的方式,如Java中提供的网络编程,在Android中都提供了支持.Android中常用的网络编程方式如下: 针对TCP/IP协议的Socket和ServerSock

微信红包的架构设计简介

@来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢) 概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量. 微信的金额什么时候算? 答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.. 采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低. 实时性:为什么明明抢到红包,点开后发现没有? 答:2014年的红包一点开就知道金额,分两次操作

JSON 简介

ylbtech-JSON: JSON 简介 JSON:JavaScript Object Notation(JavaScript 对象表示法) JSON是存储和交换文本信息的语法,类似 XML. JSON 比 XML 更小.更快.更易解析. JSON 实例 { "employee":[ {"firstName":"John","lastName":"Doe"}, {"firstName"

循环链表

?? 循环链表和单链表没有本质上的区别.唯一不同的链表的最后不再是空的了,而是指向了first头指针.仅仅有这样我们才会实现链表的循环功能,那么问题来了,我们在以下的函数功能中我们仅仅是须要把里面用的头指针的重用名换到first->next中.并且当中的计数器count也从1開始计数,这样就避免了在while的循环中第一步实行不下去. 废话不多说. 具体看wo的代码吧. #ifndef CirLinkList_H #define CirLinkList_H #include<iostream&