当前位置: 首页 > news >正文

双向链表的结点插入

引入:

在单链表中,查找其直接后继的时间复杂度为O(1),而查找其直接前驱的时间复杂度为O(n)。

好比如下单链表:

若查找2的直接后继,记指针p指向值为2的节点(p->data=2),则2的直接后继是p->next;但若查找2的直接前驱时,无法通过p直接获取(单链表无前驱指针),需从头指针head开始遍历,直到找到节点q满足q->next == p(q即为p的前驱),遍历最坏需走n步,因此时间复杂度为O(n);故面对这种情况,为降低时间复杂度,我们引入双向链表。

双向链表简介:

第一个格子为prev(指向前一个结点),第二个格子为data(存放数据),第三个格子为next(指向后一个结点);

与单向链表不同的是,双向链表多了一个可以指向前一个结点的指针(即prev),假设图中头结点head后一个结点为q,则有q->prev = head;head->next = q;这样,链表就能通过next和prev两个指针向前或向后遍历,不再是单方向的流动。

双向链表的核心优势:

  • 查找直接前驱 / 后继的时间复杂度均为 O (1)(通过prev/next指针直接获取),解决了单链表查找前驱 O (n) 的问题;
  • 插入 / 删除操作时,无需像单链表那样从头遍历找前驱节点,仅需通过prev指针直接定位,操作效率提升;
  • 注意:双向链表的代价是每个节点多占用一个指针的内存空间(空间换时间)。

在双向链表中,头插法的使用:

流程图:

在已知双向链表的基础上使用头插法,按如上图的步骤更改箭头的指向

核心代码及理解:

在双向链表中,尾插法的使用:

流程图:

第一步:将存放新数据的结点记为p,p->prev =tail(尾结点);

第二步:tail->next = p;将原来的尾结点的next指向新的尾结点new;

第三步:第三步:p->next = NULL(新节点作为新尾节点,后继指向NULL);

若为「双向循环链表」,第三步需改为p->next = L(头结点),同时L->prev = p(头结点的前驱指向新尾节点),维持循环结构。

核心代码及理解:

在双向链表中,指定位置插入节点的使用:

第一步:在双向链表中,指定位置插入(pos从1开始计数),优先找“前驱节点”(更符合操作习惯),遍历的终止条件是“找到第pos-1个节点”,且必须判断遍历过程中指针是否为空(避免pos超出链表长度)(下面的代码图展示的是前驱结点)

第二步:将数据e存放在新的结点q中

第三步:改变prev和next的指向,让数据e被插入链表中

流程图:

核心代码:

通过遍历找到指定位置的前一个结点:

更改指针的指向,让新结点插入链表中来:

  • p8和p9的代码图源于b站逊哥
http://www.cnnetsun.cn/news/192272.html

相关文章:

  • f1系列替换下载失败
  • LangFlow内置模板库发布,涵盖常见AI应用场景
  • Centos7安装Maven环境
  • 【Arbess】1、安装Arbess
  • 实战案例:Arduino Uno R3开发板读取加速度传感器数据
  • 集体好奇心与团队学习能力的正相关
  • 树莓派5安装ROS2快速理解操作流程
  • LangFlow企业文化宣传文案生成工具
  • Java SpringBoot+Vue3+MyBatis 太原学院商铺管理系统系统源码|前后端分离+MySQL数据库
  • LangFlow员工满意度调查问卷生成器
  • SpringBoot+Vue 网上宠物店系统平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • 公考日记9
  • Screen to Gif帧率调整的正确姿势
  • LangFlow走失老人定位协助流程设计
  • 操作系统移植视角下的x64和arm64差异:核心要点
  • vivo X300系列凭什么更受欢迎?旗舰体验这次更到位
  • 新手避坑指南:multisim14.3下载安装时防病毒误删技巧
  • LangFlow水族箱生态监控报警系统设想
  • elasticsearch可视化工具实现集群负载均衡监控教程
  • 自创的机械臂新算法,因为是AI写的,暂时,并不智能,但目前支持任何段数
  • OrCAD与Allegro协同工作:无缝对接设计流程
  • 从零实现无乱码开发环境:Keil + UTF-8-BOM配置教程
  • 调整IDE设置以避免代码自动换行
  • Java面试官怒怼水货程序员:Spring Cloud微服务+Kafka消息队列+Redis缓存,你到底会不会?
  • HBuilderX运行网页空白或报错?图解说明核心要点
  • Windows下Arduino安装教程:从下载到IDE配置手把手指导
  • 并网型直驱永磁同步风力发电系统simulink仿真
  • 如何为色盲人士创建可访问的图表
  • 解决: macOS 长按一个键不连续输出
  • USB3.0引脚定义与连接器选型配合要点通俗解释