双向循环链表(双向循环链表删除节点)
本篇文章给大家谈谈双向循环链表,以及双向循环链表删除节点对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
数据结构— 循环链表、双向(循环)链表
链表的两头连接,形成了一个环状链表,称为循环链表。
约瑟夫环问题,是一个经典的循环链表问题,题意是:已知 n 个人(以编号1,2,3,…,n分别表示)围坐在一张圆桌周围,从编号为 k 的人开始顺时针报数,数到 m 的那个人出列;他的下一个人又从 1 还是顺时针开始报数,数到 m 的那个人又出列;依次重复下去,要求找到最后出列的那个人。
例如有 5 个人,要求从编号为 3 的人开始,数到 2 的那个人出列:
出列顺序依次为:
编号为 3 的人开始数 1,然后 4 数 2,所以 4 先出列;
4 出列后,从 5 开始数 1,1 数 2,所以 1 出列;
1 出列后,从 2 开始数 1,3 数 2,所以 3 出列;
3 出列后,从 5 开始数 1,2 数 2,所以 2 出列;
最后只剩下 5 自己,所以 5 出列。
循环链表和动态链表唯一不同在于它的首尾连接,这也注定了在使用循环链表时,附带的最多的操作就是遍历链表。在遍历的过程中,尤其要注意循环链表虽然首尾相连,但并不扰山表示该链表没有第一个节点和最后一个结点。所以,不要随意改变头指针的指向。
整个链表只能单方向从表头访问到表尾,这种结构的链表统称为 “单向链表”或“单链表”。
如果算法中需要频繁地找某结点的前趋结点,单链表的解决方式是遍历整个链表,增加算法的时间复杂度,影响整体效率。
为了快速便捷地解决这类问题,在单向链表的基础上,给各个结点额外配备一个指针变量,用于指向每个结点的直接前趋元素。这样的链表被称为“双向链表”或者“双链表”。
双向链表中的结点有两个指针域,一个指向直接前趋,一个指向直接后继。(链表中第一个结点的前趋结点为NULL,最后一个结点的后继结点为NULL)
结点的具体构成:
双向链表创建的过程中,每一个结点需要初始化数据域和两个指针域,一个指向直接前趋结点,另一个指向直接后继结点。
创建一个双向链表line(1,2,3):
比如在(1,2,3)中插入一个结点 4,变成(1,4,2,3)。
实现效果图:
在双向链表中插入数据时,首先完成图中标注为 1 的两步操作,然后完成标注为 2 的两步操作;反之,如果先完成 2,就无法通过头指针访问结点 2,需要额外增设指针,虽然能实现,但较前一种麻烦。
双链表删除结点时,直接遍历链表,找到要删除的结点,然后利用该结点的两个指针域完成删除操作。
在(1,4,2,3)中删除结点 2:
双向链表的查找操作和单链表的实现方法完全一样,从链表的头结点或者首元结点开始遍历,正氏这里不做过多解释。
更改链表中某结点的数据域的操作是在查找的基础上完成的。通过遍历找到存储有该数据元素的结点后,直接更改其数据域就可以。
其实举李散就是双向链表和循环链表的结合体
例如:约瑟夫环问题其实还可以这样玩:如果顺时针报数,有人出列后,顺时针找出出列位置的下一个人,开始反方向(也就是逆时针)报数,有人出列后,逆时针找出出列位置的下一个人,开始顺时针报数。依次重复,直至最后一个出列。
有兴趣可以自行尝试,这里就不再分析了,因为本质就是双向链表和循环链表。
[img]双向循环链表的主要优点?
双向链表的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。
单链表的缺点是只能往前,不能后退,虽然有循环单链行枯和表,但后退的成本还是很高的,需要跑一圈。在这个时候呢,双向链表就应运而生了,再加上循环即双向循环链表就更加不错了。所谓双向链表只不过是添加了一个指向前驱结点的指针,双向循环链表是将最后一个结点的后继指针指向头结点。
扩展资料:
循环败者链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有档盯所不同。
单向链表(单链表)其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始。 通过指针连接起来,但是只能单向遍历的内存块。由于它是单向的,或者说不可逆的,所以我们可以把它比作人生:小学-中学-大学-工作-养老。
非空的双向循环链表中任何结点的前驱指针均不为空
是正确的。 只要是姿型循环链表,任一一个节点的前驱指针和后继指针都不会为空。 双向循环链表是循环链表的一种拦祥,所以也适用于这个规律。
原因如下:
1 对于单向链表,是从第一个节点开始,到最后一个节点结束,其指向为
P1-P2-P3-...-Pn
第一个节点P1的前驱指针和最后一个节点Pn的后继指针为空。
2 对于循环链表, 会将最后一个节点指向第一个节点,构成循环:
P1-P2-P3-...-Pn-P1
而双向循环链表则是每个节点两个指针,分别指向上一个和下一个:
P1-P2-P3-...-Pn-P1\
从这个结构可以看出, 每一个节点的前驱和后继都不可能为空, 当只有一个节点简册搏的时候,前驱和后继都是自身。
双向循环链表是什么?
在单链吵乱表中,从一已知结点出发,只能访问该结点及其后续结点,无法找到该结点之前的其他结点。而在单循环链升慧档表中,虽然从任一结点出发都可访问表中所有结点,但访问该结点的直接前驱结点的时间复杂度为O(n)。另外,在单链表中,若已知某结点的存储位置p,则将一新结点s插入p之前(称为前插),不如插入p之后方便,因为进行前插操作必须知道p的直接前驱位置。同理,删除p本身不如删除p的直接后继方便。因此,由于单链表的缺点,碧携引入了双向链表。
1.双向链表(DoubleLinkedList)的概念双向链表指的是构成链表的每个结点中设立两个指针域:一个指向其直接前驱的指针域prior,一个指向其直接后继的指针域ne*t。这样形成的链表中有两个方向不同的链,故称为双向链表。
2.双向循环链表将双向链表的头结点和尾结点链接起来也能构成循环链表,其称为双向循环链表。
2.双向链表C语言实现的类型定义4.双向链表示意图双向链表示意,如图1所示。
图1双向链表示意
关于双向循环链表和双向循环链表删除节点的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。