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

一、双向链表

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

从零开始养成算法·篇四:双向链表与双向循环链表_第1张图片
定义

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

步骤:

1、*L 指向头结点

2、新增数据:

2.1.创建1个临时的结点

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

① temp 是p的后继

② temp 的前驱是p

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

从零开始养成算法·篇四:双向链表与双向循环链表_第2张图片
创建新链表

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

从零开始养成算法·篇四:双向链表与双向循环链表_第3张图片
插入指定位置

4、删除

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

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

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

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

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

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

7. 删除delTemp结点

从零开始养成算法·篇四:双向链表与双向循环链表_第4张图片
删除

二、双向循环链表

1、创建

步骤:

1、*L 指向头结点

2、新增数据:

2.1.创建1个临时的结点

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

① temp 是p的后继

② temp 的前驱是p

③ temp的后继是*L

④ p 的前驱是新建的temp

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

从零开始养成算法·篇四:双向链表与双向循环链表_第5张图片
初始化或创建

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 结点


从零开始养成算法·篇四:双向链表与双向循环链表_第6张图片
插入

3、删除

步骤:

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

2.找到要删除的结点

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

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

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

6. 删除结点temp

从零开始养成算法·篇四:双向链表与双向循环链表_第7张图片
删除

你可能感兴趣的:(从零开始养成算法·篇四:双向链表与双向循环链表)