美文网首页数据结构和算法分析算法
从零开始养成算法·篇三:双向链表与双向循环链表

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

作者: 文竹_自然 | 来源:发表于2020-04-04 22:44 被阅读0次

    一、双向链表

    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

    删除

    相关文章

      网友评论

        本文标题:从零开始养成算法·篇三:双向链表与双向循环链表

        本文链接:https://www.haomeiwen.com/subject/hinsphtx.html