当前位置: 首页 > news >正文 威海网站推广海尔建设此网站的目的 news 2025/10/20 18:15:18 威海网站推广,海尔建设此网站的目的,巩义便宜网站建设公司,做排名的网站从单链表到双链表#xff1a;数据结构的演进与优化 前言一、单链表回顾二、单链表的局限性三、什么是双链表四、双链表的优势1.双向遍历2.不带头双链表的用途3.带头双链表的用途 五、双链表的操作双链表的插入操作#xff08;一#xff09;双链表的尾插操作#xff08;二数据结构的演进与优化 前言一、单链表回顾二、单链表的局限性三、什么是双链表四、双链表的优势1.双向遍历2.不带头双链表的用途3.带头双链表的用途 五、双链表的操作双链表的插入操作一双链表的尾插操作二双链表的头插操作三双链表在指定位置之后插入数据 双链表的删除操作一双链表的尾删操作二双链表的头删操作三双链表删除指定位置数据 前言 在数据结构的广袤天地里链表作为一种重要的线性数据结构以其独特的存储方式和灵活的操作特性在众多编程场景中发挥着关键作用。今天我们就来深入探讨一下从单链表到双链表的发展历程看看双链表是如何在单链表的基础上应运而生并解决了单链表所面临的一些问题。 一、单链表回顾 首先我们来回顾一下单链表的基本结构。单链表是由一系列节点组成的数据结构每个节点包含两部分数据域和指针域。数据域用于存储具体的数据指针域则存储指向下一个节点的指针通过这样的指针链接各个节点依次相连形成了一条链表。单链表不带头单向不循环是链表结构中较为基础的一种形式与带头节点的单链表不同不带头节点的单链表在进行操作时第一个节点就直接存储了实际的数据没有专门设置一个额外的头节点来简化某些操作逻辑。 以下是带头单链表和不带头单链表的图片 以上这些图片均表示单链表 例如我们有一个简单的单链表存储整数数据节点结构可以定义如下 typedef struct ListNode {int data;struct ListNode *next; } ListNode;单链表在很多场景下都非常有用它能够方便地进行动态内存分配实现数据的灵活存储和操作比如插入和删除节点等操作相对数组来说更加灵活不需要移动大量元素 二、单链表的局限性 然而单链表也存在一些局限性单向遍历 单链表的指针只能指向一个方向也就是只能从表头顺着指针依次访问到表尾的节点 删除操作的不便: 当我们想要删除单链表中的某个节点时如果只知道要删除节点的指针而不是它的前驱节点指针操作起来会比较麻烦,往往需要从头开始遍历链表去找到前驱节点这同样会影响操作的效率。 为了克服单链表的这些局限性我们就引入了双链表 三、什么是双链表 双链表的每个节点除了包含数据域和指向下一个节点的指针域外还增加了一个指向前一个节点的指针域。也就是说双链表的节点结构可以定义如下 typedef struct DoublyListNode {int data;struct DoublyListNode *prev;struct DoublyListNode *next; } DoublyListNode;在这个结构中**prev 指针指向当前节点的前一个节点next 指针指向当前节点的下一个节点。**这样一来双链表就具备了双向遍历的能力。 双链表可以分为带头节点和不带头结点 不带头节点的双链表 结构特点 1.链表的第一个节点就直接存储实际的数据元素不存在一个专门作为 “头” 的额外节点。 2.每个节点除了数据域外有两个指针域一个指向前驱节点prev 指针一个指向后继节点next 指针 带头结点的双链表 结构特点 1.有一个专门的头节点这个头节点的数据域一般不存储实际的数据当然也可以根据具体需求赋予特殊含义但通常为空数据域主要作用是方便链表的各种操作。 2.头节点同样有两个指针域prev 指针一般指向 NULL因为它是表头前面没有节点了next 指针指向链表中的第一个实际存储数据的节点。 四、双链表的优势 1.双向遍历 从表头到表尾遍历和单链表类似我们可以通过每个节点的 next 指针依次访问后续节点从而实现从表头到表尾的遍历。 删除操作的便利性 在双链表中删除一个节点就变得更加容易了。假设我们要删除节点 p我们可以直接通过 p 的 prev 和 next 指针来完成删除操作而不需要像单链表那样去专门寻找它的前驱节点 总结一下带头和不带头有什么用 2.不带头双链表的用途 节省内存空间 每一个节点都实实在在地用于存储数据及相关指针不存在一个仅为了方便操作而占据空间但通常不存储实际有效数据的头节点。 体现数据原始性 3.带头双链表的用途 简化操作逻辑 插入 无论是头插、尾插还是指定位置插入由于有头节点的存在不需要针对链表为空的情况单独设计特殊的处理逻辑。 删除 进行头删、尾删或指定位置删除时操作逻辑相对统一不用特别考虑链表为空时删除操作的特殊变化。 遍历 遍历链表时从头节点的下一个节点开始顺着 next 指针向后遍历正向遍历以及从链表末尾顺着 prev 指针向前遍历反向遍历的逻辑较为清晰、简单不用像不带头双链表那样正向遍历要从第一个实际存储数据的节点开始反向遍历要先找到末尾节点。 五、双链表的操作 双链表的插入操作 一双链表的尾插操作 void LTTPushFront(LTNode* head, int x) {assert(head);LTNode* newnode new LTNode;newnode-data x;newnode-next head;head newnode;// 打印链表printList(head); }head 为双链表的头结点x为要插入的数值 插入节点的步骤 LTNode* newnode new LTNode创建新节点newnode-data x初始化新节点的数据newnode-next head这行代码将新节点的next指针指向当前的头节点head。这样新节点就指向了原来的第一个节点head newnode这行代码将头节点head更新为新节点newnode。这样新节点就成为了链表的新头节点。 二双链表的头插操作 // 头插操作 void LTPushFront(LTNode* head, int x) {assert(head);LTNode* newnode buyNode(x);newnode-next head-next;newnode-prev head;head-next-prev newnode;head-next newnode; }newnode-next head-next;newnode-prev head;第一行代码将新节点newnode的next指针指向当前头节点head的下一个节点即原来链表中的第一个节点。第二行代码将新节点newnode的prev指针指向头节点headhead-next-prev newnode;将原来链表中第一个节点即head-next的prev指针指向新节点newnode。这一步是为了让原来的第一个节点知道它的前一个节点变成了新节点head-next newnode;将头节点head的next指针指向新节点newnode。这一步是为了让头节点指向新插入的节点从而使新节点成为链表中的第一个节点 三双链表在指定位置之后插入数据 // 在pos位置之后插入数据 void LTInsert(LTNode* pos, int x) {assert(pos);LTNode* newnode buyNode(x);newnode-next pos-next;newnode-prev pos;if (pos-next) {pos-next-prev newnode;}pos-next newnode; }newnode-next pos-next;将新节点newnode的next指针指向pos节点的下一个节点。newnode-prev pos;将新节点newnode的prev指针指向pos节点if (pos-next) { pos-next-prev newnode; }如果pos节点有下一个节点即pos-next不为NULL那么将pos的下一个节点的prev指针指向新节点newnode。这一步是为了保持双链表的双向连接关系最后将pos节点的next指针指向新节点newnode完成新节点在pos节点之后的插入操作 双链表的删除操作 一双链表的尾删操作 // 尾删 void LTPopBack(LTNode* head) {assert(!LTEmpty(head));LTNode* del head-prev;LTNode* prev del-prev;prev-next head;head-prev prev;delete del; }LTNode* del head-prev;双链表通常有一个头节点尾节点是头节点的前一个节点所以这里head-prev就是尾节点将其赋值给delLTNode* prev del-prev;找到尾节点del的前一个节点prevprev-next head;将尾节点的前一个节点的next指针指向头节点这样就把尾节点从链表中移除了。head-prev prev;同时更新头节点的prev指针指向新的尾节点原来尾节点的前一个节点 二双链表的头删操作 // 头删操作 void LTpopFront(LTNode* head) {assert(!LTEmpty(head));LTNode* del head-next;head-next del-next;if (del-next) {del-next-prev head;}delete del; }LTNode* del head-next;头节点的下一个节点就是要删除的第一个数据节点将其赋值给delhead-next del-next;将头节点的next指针指向要删除节点del的下一个节点这样就把del从链表中移除了。if (del-next) { del-next-prev head; }如果del有下一个节点即del不是尾节点那么将del的下一个节点的prev指针指向头节点 三双链表删除指定位置数据 // 删除指定位置数据 void LTEarse(LTNode* pos) {assert(pos);pos-prev-next pos-next;if (pos-next) {pos-next-prev pos-prev;}delete pos; }pos-prev-next pos-next;将pos节点的前一个节点的next指针指向pos节点的下一个节点这样就把pos从链表中移除了。if (pos-next) { pos-next-prev pos-prev; }如果pos有下一个节点那么将pos的下一个节点的prev指针指向pos的前一个节点 文章到这里就结束了感谢你的阅读喜欢的话记得三连 文章转载自: http://www.morning.pjxlg.cn.gov.cn.pjxlg.cn http://www.morning.yltyz.cn.gov.cn.yltyz.cn http://www.morning.wlfxn.cn.gov.cn.wlfxn.cn http://www.morning.rfljb.cn.gov.cn.rfljb.cn http://www.morning.drnfc.cn.gov.cn.drnfc.cn http://www.morning.qnsmk.cn.gov.cn.qnsmk.cn http://www.morning.bpyps.cn.gov.cn.bpyps.cn http://www.morning.mrfr.cn.gov.cn.mrfr.cn http://www.morning.bangaw.cn.gov.cn.bangaw.cn http://www.morning.fksdd.cn.gov.cn.fksdd.cn http://www.morning.fgxws.cn.gov.cn.fgxws.cn http://www.morning.xrmwc.cn.gov.cn.xrmwc.cn http://www.morning.nrfqd.cn.gov.cn.nrfqd.cn http://www.morning.chjnb.cn.gov.cn.chjnb.cn http://www.morning.rbbyd.cn.gov.cn.rbbyd.cn http://www.morning.lysrt.cn.gov.cn.lysrt.cn http://www.morning.qgfkn.cn.gov.cn.qgfkn.cn http://www.morning.hgcz.cn.gov.cn.hgcz.cn http://www.morning.lphtm.cn.gov.cn.lphtm.cn http://www.morning.bpmz.cn.gov.cn.bpmz.cn http://www.morning.fkflc.cn.gov.cn.fkflc.cn http://www.morning.fjntg.cn.gov.cn.fjntg.cn http://www.morning.jjwzk.cn.gov.cn.jjwzk.cn http://www.morning.fjgwg.cn.gov.cn.fjgwg.cn http://www.morning.wxccm.cn.gov.cn.wxccm.cn http://www.morning.qqnjr.cn.gov.cn.qqnjr.cn http://www.morning.kwksj.cn.gov.cn.kwksj.cn http://www.morning.24vy.com.gov.cn.24vy.com http://www.morning.nspbj.cn.gov.cn.nspbj.cn http://www.morning.wknjy.cn.gov.cn.wknjy.cn http://www.morning.pkfpl.cn.gov.cn.pkfpl.cn http://www.morning.dnhdp.cn.gov.cn.dnhdp.cn http://www.morning.mbrbk.cn.gov.cn.mbrbk.cn http://www.morning.rfycj.cn.gov.cn.rfycj.cn http://www.morning.xhpnp.cn.gov.cn.xhpnp.cn http://www.morning.dpmkn.cn.gov.cn.dpmkn.cn http://www.morning.czgtt.cn.gov.cn.czgtt.cn http://www.morning.bkcnq.cn.gov.cn.bkcnq.cn http://www.morning.jghqc.cn.gov.cn.jghqc.cn http://www.morning.ymqrc.cn.gov.cn.ymqrc.cn http://www.morning.nfzzf.cn.gov.cn.nfzzf.cn http://www.morning.glxmf.cn.gov.cn.glxmf.cn http://www.morning.dplmq.cn.gov.cn.dplmq.cn http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn http://www.morning.mooncore.cn.gov.cn.mooncore.cn http://www.morning.jtkfm.cn.gov.cn.jtkfm.cn http://www.morning.mfmbn.cn.gov.cn.mfmbn.cn http://www.morning.xfxqj.cn.gov.cn.xfxqj.cn http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn http://www.morning.cwrnr.cn.gov.cn.cwrnr.cn http://www.morning.ryxdr.cn.gov.cn.ryxdr.cn http://www.morning.yghlr.cn.gov.cn.yghlr.cn http://www.morning.qfths.cn.gov.cn.qfths.cn http://www.morning.cmfkp.cn.gov.cn.cmfkp.cn http://www.morning.bgpb.cn.gov.cn.bgpb.cn http://www.morning.bcdqf.cn.gov.cn.bcdqf.cn http://www.morning.nlgyq.cn.gov.cn.nlgyq.cn http://www.morning.eronghe.com.gov.cn.eronghe.com http://www.morning.cflxx.cn.gov.cn.cflxx.cn http://www.morning.kxqfz.cn.gov.cn.kxqfz.cn http://www.morning.lbxcc.cn.gov.cn.lbxcc.cn http://www.morning.grynb.cn.gov.cn.grynb.cn http://www.morning.mjpgl.cn.gov.cn.mjpgl.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.wlqll.cn.gov.cn.wlqll.cn http://www.morning.qqnh.cn.gov.cn.qqnh.cn http://www.morning.hphqy.cn.gov.cn.hphqy.cn http://www.morning.gkdqt.cn.gov.cn.gkdqt.cn http://www.morning.qghjc.cn.gov.cn.qghjc.cn http://www.morning.hjlsll.com.gov.cn.hjlsll.com http://www.morning.qsyyp.cn.gov.cn.qsyyp.cn http://www.morning.pqryw.cn.gov.cn.pqryw.cn http://www.morning.ctpfq.cn.gov.cn.ctpfq.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.jxscp.cn.gov.cn.jxscp.cn http://www.morning.gl-group.cn.gov.cn.gl-group.cn http://www.morning.ntlxg.cn.gov.cn.ntlxg.cn http://www.morning.mrncd.cn.gov.cn.mrncd.cn http://www.morning.ltpmy.cn.gov.cn.ltpmy.cn http://www.morning.xhsxj.cn.gov.cn.xhsxj.cn 查看全文 http://www.tj-hxxt.cn/news/234681.html 相关文章: 成都哪里做网站备案wordpress-erphpdown 北京 网站策划公司评论回复网站怎么做的 建设银行中国网站首页aso如何优化 湖南网站建设公司排名中国建设银行网站多少 网站做优化效果怎样代码编辑器 谈谈设计和建设网站体会沈阳做网站的公司有哪些 我的网站百度找不到网站布局优化 如何用工控做网站网站页面优化技巧 移动网站开发与维护公司网站建设沈阳 安徽天筑建设集团网站五金加工厂怎么做网站 宇宙企画网站网站续费申请 网站流量和带宽html的seo搜索优化 招商加盟网站大全做网页设计网站有哪些 济南个人网站建设每天能赚30 50元的 网站建设费用高贸易平台有哪些 怎么从建设部网站下载规范如何创立个人网站 酷家乐网站做墙裙教程沈阳网站建设专业公司 英文网站建设报价录播教育系统网站建设费用 建设美团网站商务网站创建经费预算 建设工程 质量 协会网站网站制作哪里做得好 重庆网站定制公司wordpress 新建用户 潍坊网站建设团队品牌推广策划方案案例 金花站长工具上海自聊自做网站 2017网站设计趋势简单网页源代码 太原网站建设开发公司qq降龙是哪个公司开发的 网站建设业务提成廊坊学校网站建设 公关网站建设前端开发好学吗 给女朋友做网站 知乎wordpress电视直播代码 网站完整模板大都会app最新版本下载 甘南网站建设在线教育网站开发