首页 > 其他分享 >数据结构线性表之【循环链表、双向链表】

数据结构线性表之【循环链表、双向链表】

时间:2024-01-08 23:00:58浏览次数:34  
标签:结点 顺序 线性表 后继 链表 数据结构 指针

循环链表

单链表中,每个结点都带有一个指向其后继结点的指针,但因为表尾元素没有后继结点,所以表尾结点的指针域为空,表明它不指向任何结点,并表示这个结点是最后一个结点。

现在修改这个约定,将表尾结点的指针指回头结点,从而形成一类新链表。在这样的链表中,从任何一个结点出发并沿着指针域的指示,可以回到这个结点,好像转了一个圈,可以将这样的链表称为循环链表,更准确地说,它是单向循环链表

数据结构线性表之【循环链表、双向链表】_链表

在带头结点的单链表中,表为空的判断条件是“head->next == null”,而在循环链表中,表为空的判断条件是“head->next==head”。

双向链表

在单链表中,每个结点都仅含有一个指针,除表尾结点以外,该指针指向后继节点,故超找后继节点的操作很方便。从插入及删除操作的实现步骤中可以了解到,查找前驱结点很不方便。

在表结点中,除保留指向后继结点的指针以外,在增加一个指向该结点的前驱结点的指针,即每个结点都含有两个指针,一个指向该结点的后继结点,另一个指向该结点的前驱结点。如果结点的前驱结点或后继结点不存在,则相应的指针为空。这样的链表称为双向链表,也称双链表

数据结构线性表之【循环链表、双向链表】_数据结构_02

顺序表与链表的比较

  1. 顺序表存储每个元素时,空间比较紧凑,占用空间连续
  2. 顺序表数组的每个单元只需保存数据本身,没有额外的开销。(链表有前后指针)
  3. 顺序表初始化的时候,通常要“宽松”一些,当线性表中元素个数没有达到顺序表的最大容量时,数组中仍然会有空闲的空间,此时并没有充分利用全部空间。
  4. 链表中的占用空间大小与链表中的元素个数成正比,分配的节点是全部被使用的。当线性表的元素个数相对较少时,链表的实现比顺序表的实现更节省空间。
  5. 选择顺序表或链表的一个因素是,当线性表中的元素个数变化较大或未知时,最好使用链表实现,如果知道线性表的大致长度,则使用顺序表时占用的空间效率会更高。
  6. 时间效率。以访问线性表的第i个元素为例,在顺序表中是直接定位的,可以实现随机访问,操作的时间复杂度是O(1)。相比之下,单链表不能随机访问指定的元素,访问时必须从表头开始逐个查找,直到找到第i个结点为止。这个操作的平均时间复杂度和最差时间复杂度均为O(n)。关于插入和删除操作,在给出指向链表合适位置的当前指针后,在单链表内进行插入和删除的时间复杂度可以达到O(1)。而顺序表的插入时间复杂度均为O(n)。对应线性表的许多应用,插入和删除都是主要操作,因此它们的时间效率非常重要,仅对此而言,单链表通常比顺序表更灵活。

标签:结点,顺序,线性表,后继,链表,数据结构,指针
From: https://blog.51cto.com/AmbitionGarden/9151983

相关文章

  • 数据结构【树篇】(二)
    数据结构【树篇】(二)文章目录数据结构【树篇】(二)前言为什么突然想学算法了?为什么选择码蹄集作为刷题软件?目录树(一)、树的存储(二)、树和森林的遍历——并查集(三)、并查集的优化结语前言为什么突然想学算法了?>用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重......
  • 刷题笔记——单向链表(C++)
    206.反转链表-力扣(LeetCode)给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。解题思路三指针。temp指针用于存储当前节点的下一节点,pre指针用于存储当前节点反转后指向的新节点。具体操作如下:反转过程:代码实现classSolution{public:ListNode*reverseList(Li......
  • 算法与数据结构(开篇)
    基本概念:算法(Algorithm):⼀个计算过程,解决问题的⽅法NiklausWirth:“程序=数据结构+算法”时间复杂度时间复杂度:⽤来评估算法运⾏效率的⼀个式⼦经验当算法过程出现循环折半的时候,复杂度式⼦中会出现logn.时间复杂度是⽤来估计算法运⾏时间的⼀个式⼦(单位)常⻅的时间复杂度(按效率排......
  • 循环单链表实现
    #include<stdio.h>#include<stdlib.h>#defineElemtypeint#defineERROR-1/*循环链表实现*/typedefstructNode{Elemtypee;Node*next;}Node,*LinkList;voidInitList(LinkList&pHead){pHead=(Node*)malloc(sizeof(Node)......
  • 严蔚敏《数据结构》存储结构
    目录1.单链表2.双向链表3.带头结点的链表4.顺序栈5.单链队列6.循环队列7.广义表头尾链表存储8.广义表的扩展线性链表存储9.二叉树二叉链表存储表示10.树的双亲表示法11.树的孩子链表存储表示(孩子表示法)12.树的孩子兄弟表示法(二叉树表示法)13.二叉树的二叉线索存储......
  • 链表-adlist
    2.链表相关文件adlist.hadlist.c1.定义typedefstructlistNode{structlistNode*prev;structlistNode*next;void*value;}listNode;typedefstructlistIter{listNode*next;intdirection;}listIter;typedefstructlist{l......
  • 数据结构——顺序线性表(向量)
    参考文章:数据结构(顺序表——线性表)_创建顺序线性表sl,调用initlist()函数对sl初始化-CSDN博客以下是作为个人笔记,自己学习用。线性表是具有相同特性的数据元素的一个有限序列,在线性表中每个数据元素由逻辑序号唯一确定。线性表的特性:1.有穷性:表中元素个数是有限的。2.一致性:表中所......
  • 数据结构【线性表之单链表】
    链表链表:线性表还可以使用链式存储方式保存,即线性表中的各个元素保存在各自的存储空间中,形成一个个节点。这些结点在内存的地址不要求是相邻的,它们之间通过指针连接起来。特点:灵活存储,不要求预先分配一块连续的空间,而是按需分配,随时需要,随时分配不要求分配的空间必须是相邻的没有......
  • 数据结构线性表之顺序表
    定义:一个线性表是由同类型数据元素构成的有限序列一般地,当表示一个由n(n>=0)个元素组成的线性表L时,将线性表中的所有元素列在一对括号中,每个元素之间以逗号分隔,如L=(a0,a1,....,an-1)不搞的像数据那么麻烦了,按我理解的来表项:线性表中的数据元素表头元素:线性表的第一个元素表尾元素:......
  • Redis 底层数据结构
    在Redis数据结构和对象机制中提到的图中,我们知道,可以通过redisObject对象的type和encoding属性。可以决定Redis主要的底层数据结构:SDS、QuickList、ZipList、HashTable、IntSet、ZskipList。一、简单动态字符串(SDS)先来看看传统的C语言如何存储字符串的:比如一个"Redis"......