首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【数据结构】线性表 ⑥ ( 双循环链表 | 双循环链表插入操作 | 双循环链表删除操作 | LinkedList 双循环链表源码分析 )

一、双循环链表插入操作处理 双循环链表 , 需要对 插入 / 删除 / 遍历 操作 进行特殊处理 , 因为需要调节 前驱指针 和 后继指针 两个指针 ; 如 : 双循环链表 , 如果要插入元素...---- 下面的链表插入成功 , 顺序为 a , c , b , 如果要删除循环链表的 c 元素 , 只需要将 a 元素的 后继指针 指向 b , 将 b 元素的 前驱指针 指向 a 即可 ;...LinkedList 双循环链表 , 调用 public E remove(int index) 函数 , 删除指定索引的元素 ; 删除的核心操作 , 就是 unlink 函数 , 将指定节点...双循环链表 脱离 ; /** * 移除此列表中指定位置的元素。...* 将所有后续元素向左移动(它们的索引减去1)。 * 返回列表删除的元素。

20220

约瑟夫环看循环链表

约瑟夫环看循环链表 约瑟夫环问题是这样: 描述 编号为1,2,...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。...报m的人出圈,同时留下他的密码作为新的m值,他在顺时针方向上的下一个人开始,重新1开始报数,如此下去,直至所有的人全部出圈为止。...因为这里所有人都围成一圈,而且要频繁地进行删除的操作,如果用数组来储存数据就显得有些慢了。正好我最近也在自己看数据结构的书,所以这里就借这一题实践一下循环链表。...(我的方向从来不是NOI和ACM,写的东西可能比较业余,不伦不类,请大家见谅……) 循环链表就是把我们线性链表的最后一个节点的指针域指向第一个有效节点。...我们完全可以先造一个非循环链表,然后再把它的尾指针指向首节点。 首先定义一个结构体,用它来做我们的节点。

46521
您找到你想要的搜索结果了吗?
是的
没有找到

图解环形链表——创建、循环赋值与删除

链表名字上来看是一条数据链,一般的链表其末尾节点是没有指向的,但当把链表的末尾节点指定为指向头节点时,则构成了一个环形链表。 ?...stData *pList = NULL; //环形链表指针 stData *pHead = NULL; //环形链表的数据头指针 stData *pTail = NULL; //环形链表的数据尾指针...,只有链表数据满了之后,才对整个环形链表的数据进行使用。...可以看到,测试程序有一个包含15个数的序列,并通过for循环依次将数据放入到环形链表,在前4次循环(0~3),环形链表没有存满,不对链表的数据处理,因此没有显示出打印信息,在第5次循环以及之后,环形链表始终是满的状态...,因此可以一直对链表数据进行处理,这里是求取平均值。

1K20

删除链表的节点

题目描述 难度级别:简单 请编写一个函数,使其可以删除某个链表给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。...现有一个链表 -- head = [4,5,1,9],它可以表示为: 示例 1: 输入:head = [4,5,1,9], node = 5 输出:[4,1,9] 解释:给定你链表中值为 5 的第二个节点...提示: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表的一个有效节点。 不要从你的函数返回任何结果。...解题思路 题目中待传递给当前函数的实参node,它是链表的某一个待删除的节点,然后链表删除这个节点。...这里因为待传入的实参没有完整的链表,所以无法获取到之前节点,所以无法修改前一个节点的next指向。这时需要的是将要删除节点的值替换为它的下一个节点的值,之后要删除这个节点的next指向为下下一项。

2.4K00

237 删除链表的节点

01 题目信息 题目地址: https://leetcode-cn.com/problems/delete-node-in-a-linked-list/ 请编写一个函数,使其可以删除某个链表给定的(非末尾...传入函数的唯一参数为 要被删除的节点 。 现有一个链表 -- head = [4,5,1,9],它可以表示为: ?...提示: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表的一个有效节点。 不要从你的函数返回任何结果。...,删除这个节点。...这样就不用改变4节点的指向,只是把它指向的这个对象值与next都改掉,那么4还是指向0x001只不过是1了,而这个指向的又是0x004就是9,链表也就变成了4--->1--->9完成删除5的操作 public

1.2K10

删除链表的重复节点.

前言 在一个排序的链表,存在重复的节点,如何删除链表重复的节点并返回删除后的链表头指针?例如:1->2->3->3->4->4->5,处理后为: 1->2->5。...常规思路 根据题意,我们可以知道链表的元素是排好序的。如果节点重复的话,当前节点一定与下一个节点相同。...: pre 指向head last 指向head.next 紧接着,我们通过while循环访问链表的每一个节点 修改pre的指针,将其指向其节点的下一个节点 修改last的指针,将其指向其节点的下一个节点...我们通过文章开头所举的例子,将其代入上述思路,画一个图来帮助大家更好的理解上述思路,如下所示: image-20220226224625702 实现代码 接下来,我们将上述思路转换为代码,如下所示: /** * 删除链表的重复节点...我们将文章开头所举的例子,代入上述思路,画一下它的递归栈帮助大家更好的理解,如下所示: image-20220228231355965 实现代码 接下来,我们将上述思路转换为代码,如下所示: /** * 删除链表的重复节点

2.7K40

2 删除链表的节点

复习链表的插入 链表的一个节点是由数据域和指针域构成,指针域的地址值为下个元素的地址。那么我们需要插入或者删除一个元素怎么处理呢? ? 先查看原始链表结构,准备将结点x插入链表。 ?...复习链表删除 上面简单介绍了带头结点的链表,在删除处理的时候同样适用,所以我们以后就直接采用带头结点的链表讲解。下面直接看看删除节点图。 ?...1 Leetcode237 删除链表的节点 请编写一个函数,使其可以删除某个链表给定的(非末尾)节点,你将只被给定要求被删除的节点。...说明: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表的一个有效节点。 不要从你的函数返回任何结果。 先思考一分钟哟! 效果更好哈!...目标还是删除5,最后结果为[4,1,9]。我们把需要删除的5结点的后面节点1赋值给它,如下图8. ?

1.3K20

循环链表的实现_建立双向循环链表

循环链表   循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环链表   带头结点的循环链表的各种操作的算法实现与带头结点单链表的算法实现类似...单链表的判别条件为p!=NULL或p->next!=NULL,而单循环链表判别条件是p!=L或p->next!=L   在循环链表附设尾指针有时候比附设头指针更简单。...如:在用头指针的循环链表找a1的时间复杂度是O(1),找an需要从头找到尾,时间复杂度是O(n),如果用为指针rear,找开始结点和终端结点的存储位置分别是rear->next->next和rear...to insert:\n") ; scanf("%d",&x); InCLLinkList(CL,i,x); Print_CLLinkList(CL); free(CL); return 0; }   循环链表删除...    方法一:先找到两个链表LA,LB的表尾,分别用p,q指向它,然后将第一个链表的表尾与第二个链表的第一个结点连起来,修改第二个表的尾q,使它的链域指向第一个表头 //头指针合并循环链表 #include

72120

如何检测链表是存在循环

也就是判断一个单链表是否存在循环而扩展衍生的问题。下面来看问题如何解决。   首先来看最基本的这个问题:如何判断一个单链表是否存在循环链表数目未知。算法不能破坏链表。...每遍历一个节点,都在这个结构查找是否遍历过。如果找到有重复,则说明该链表存在循环。如果直到遍历结束,则说明链表不存在循环。...哈希表存储的值为节点的内存地址,这样查找的操作所需时间为O(1),遍历操作需要O(n),hash表的存储空间需要额外的O(n)。所以整个算法的时间复杂度为O(n),空间复杂度为O(n)。...当有环的时候,最后指针会定位到链表的头部,如果到最后,都没有再到头部,那说明链表不存在循环。...所以快慢指针无法解决链表存在循环的问题,快慢指针能解决的只是链表存在环的问题,也就是这个循环链表尾部。可以说链表存在环是链表存在循环的一种特殊情况。

2K50

删除链表的元素基本操作。链表

删除链表中等于给定值val的所有节点。 样例 给出链表 1->2->3->3->4->5->3, 和 val = 3, 你需要返回删除3之后的链表:1->2->4->5。 基本操作。...链表 链表有很多种,这里给的是单向链表链表由节点构成,每一个节点包含两个信息,分别是数据和链(实际上就是一个指针,指向下一个节点,如果没有下一个这个指针为NULL)。...int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; 这是题目中给出的一个单向链表节点...除此之外还有双向链表(每一个链表有两条链,分别指向前一个和后一个节点),循环链表也是有的,就是收尾又链接起来,显而易见是有单向循环也有双向循环的。...链表的优点: 插入删除方便,只要改变指针的指向就可以,不用像数组一样需要移动数据。 链表的缺点: 因为内存不连续,所以查找效率不高。 它的优缺点和数组刚好是反过来的。

87710

删除排序链表的重复元素删除排序链表的重复元素 II

Remove Duplicates from Sorted List 题目大意 删除一个有序链表重复的元素,使得每个元素只出现一次。...,删除后不再有原先重复的那些数字。...解题思路 不同的地方是这里要删掉所有的重复项,由于链表开头可能会有重复项,被删掉的话头指针会改变,而最终却还需要返回链表的头指针。...所以需要定义一个新的节点,然后链上原链表,然后定义一个前驱指针和一个现指针,每当前驱指针指向新建的节点,现指针从下一个位置开始往下遍历,遇到相同的则继续往下,直到遇到不同项时,把前驱指针的next指向下面那个不同的元素...已经跑到很后面了(至少大两位),所以需要将p直接指向temp.next p.next = temp.next return dummy.next 总结 两个都是链表基础题

2.8K20

Swift 删除链表的节点 - LeetCode

LeetCode 题目: 删除链表的节点 请编写一个函数,使其可以删除某个链表给定的(非末尾)节点,你将只被给定要求被删除的节点。...现有一个链表 -- head = 4,5,1,9,它可以表示为: 4 -> 5 -> 1 -> 9 示例1: 输入: head = [4,5,1,9], node = 5 输出: [4,1,9] 解释...: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9....示例2: 输入: head = [4,5,1,9], node = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9...说明: 链表至少包含两个节点。 链表中所有节点的值都是唯一的。 给定的节点为非末尾节点并且一定是链表的一个有效节点。 不要从你的函数返回任何结果。

1.3K40
领券