【学习笔记----数据结构04-单循环链表】
来源:互联网 发布:多媒体数据挖掘 编辑:程序博客网 时间:2024/06/08 12:27
循环链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)
它解决了一个很麻烦的问题:如何从当中一个结点出发,访问到链表的全部结点。
为了使空链表与非空链表处理一致,我们通常设一个头结点,当然这并不是说,循环链表一定要头结点。其实循环链表和单链表的主要差异就在于循环的判断条件上,原来判断p->next是否为空,现在则是p->next不等于头结点,则循环示结束。
在单链表中,我们有了头结点时,我们可以用O(1)的时间访问第一个结点,但对于要访问到最后一个结点,却需要O(n)时间,因为我们需要将单链表全部扫描一遍。有没有可能用O(1)时间由链表指针访问到最后一个结点呢?不过我们需要改造一下这个循环链表,不用头指针,而是用指向终端结点的尾指针来表示循环链表
终端结点用尾指针rear指示,则查找终端结点是O(1),而开始结点,其实就是rear->next->next。其时间很杂也为O(1);
双向链表
我们在单链表中,有了next指针,这就使得我们要查找下一结点的时间复杂度为O(1)。可是如果我们要查找的是上一结点的话,那最坏的时间复杂度就是O(n)了,因为我们每次都要从头开始遍历查找。为了克服单向性这一缺点,我们的老科学家们,设计出双向链表。
双向链表(double linkedlist): 是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。所以在双向链表中的结点都有两个指针域,一个指向直接后继,另一个指向直接前驱
/*线性表的双向链表存储结构*/typedef struct DulNode{ ElemType data; struct DulNode *prior;//直接前驱指针 struct DulNode *next; //直接后继指针}DulNode,*DuLinkList;
由于是双向链表,那么对于链表中的某一个结点p,它的后继的前驱是谁?当然是它自己。它的前驱的后继自然也是它自己。即
p->next->prior = p =p->prior->next;
空的
非空的
双向链表是单链表中扩展出来 的结构,所以它的很多操作是和单链表相同的,比如求长度的ListLength,查找元素的GetElem,获得元素位置的LocateElem等。这些操作都只要涉及一个方向的指针即可,另一个指针多了也不能提供什么帮助。双向链表即然是比单链表多了如可以反向遍历查找等数据结构,那么也就需要付出一些小的代价:在插入和删除时,需要更改两个指针变量。
要删除结点:
- 【学习笔记----数据结构04-单循环链表】
- 数据结构单循环链表
- 【C++数据结构学习笔记---线性表】带头结点的单循环链表
- 数据结构链表之单循环链表
- 数据结构(线性表):单循环链表
- C++实现数据结构四 单循环链表
- 数据结构与算法(单循环链表)
- 数据结构与算法(单循环链表)
- 回顾数据结构(2):单循环链表
- 数据结构学习之链表(单向、单循环以及双向)(递归实现)
- 学习 3.3.5单循环链表
- 数据结构之单循环链表C++(模板)
- 数据结构(3)单循环链表 c++ 模板实现
- 【数据结构】两个单循环链表的连接操作
- 数据结构 - 单循环链表:选首领(C)
- 数据结构与算法(单循环链表_约瑟夫问题)
- 数据结构与算法(单循环链表_约瑟夫问题)
- 《数据结构进行曲》 带头结点单循环链表的合并
- linux 常用命令二 网络
- 基于spark mllib的LDA模型训练Scala代码实现
- Android中AIDL的实现使用
- Android Studio安装后的一些必要设置
- C# 实验五--平面直角坐标系
- 【学习笔记----数据结构04-单循环链表】
- 开通C博客了
- 5.4用形态学滤波器检测边缘和角点
- mybatis入门到精通学习文章总结
- 常用时间处理方法:时间戳和格式化时间之间转换;时间比大小
- Android全屏模式处理
- 数据库索引 - 详解
- 构造型模式之Prototype(原型)模式
- Java环境配置