从零开始养成算法·篇四:双向链表与双向循环链表

一、双向链表

1、定义:从下图中的定义结点的代码我们能发现,双向与单向最明显的区别就是是否可以反向查找上一结点。

定义

2、创建:大致和单向的创建差不多,区别在于多了prior的处理

步骤:

1、*L 指向头结点

2、新增数据:

2.1.创建1个临时的结点

2.2.为新增的结点建立双向链表关系

① temp 是p的后继

② temp 的前驱是p

③ p 要记录最后的结点的位置,方便下一次插入

创建新链表

3、插入:

步骤:

1. 插入的位置不合法 为0或者为负数

2. 新建结点

3.将p指向头结点!

4. 找到插入位置i直接的结点

5. 如果插入的位置超过链表本身的长度

6. 判断插入位置是否为链表尾部

1️⃣ 将p->next 结点的前驱prior = temp

2️⃣ 将temp->next 指向原来的p->next

3️⃣ p->next 更新成新创建的temp

4️⃣ 新创建的temp前驱 = p

插入指定位置

4、删除

1.判断双向链表是否为空,如果为空则返回0

2. 将指针p移动到删除元素位置前一个

3.如果k>i 或者 p == NULL 则返回0

4.创建临时指针delTemp 指向要删除的结点,并将要删除的结点的data 赋值给*e,带回到main函数

5. p->next 等于要删除的结点的下一个结点

6. 如果删除结点的下一个结点不为空,则将将要删除的下一个结点的前驱指针赋值p

7. 删除delTemp结点

删除

二、双向循环链表

1、创建

步骤:

1、*L 指向头结点

2、新增数据:

2.1.创建1个临时的结点

2.2.为新增的结点建立双向链表关系

① temp 是p的后继

② temp 的前驱是p

③ temp的后继是*L

④ p 的前驱是新建的temp

⑤ p 要记录最后的结点的位置,方便下一次插入

初始化或创建

2、插入

步骤:

1. 创建指针p,指向双向链表头

2.双向循环链表为空,则返回0

3.找到插入前一个位置上的结点p

4.如果i>index 则返回0

5.创建新结点temp

6.temp 结点为空,则返回error

7.将生成的新结点temp数据域赋值e.

8.将结点temp 的前驱结点为p;

9.temp的后继结点指向p->next;

10.p的后继结点为新结点temp;

11.如果temp 结点不是最后一个结点,temp节点的下一个结点的前驱为temp 结点


插入

3、删除

步骤:

1.如果删除到只剩下首元结点了,则直接将*L置空;

2.找到要删除的结点

3.给e赋值要删除结点的数据域

4.修改被删除结点的前驱结点的后继指针 

5.修改被删除结点的后继结点的前驱指针 

6. 删除结点temp

删除
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容