双向链表专题:结构、实现与对比分析
双向链表专题结构、实现与对比分析双向链表是链表中结构最复杂但使用最广泛的一种。本文将深入讲解带头双向循环链表的结构特点带您从零实现双向链表的核心接口增删改查并与顺序表进行全方位对比分析各自的适用场景。目录一、双向链表的结构1. 带头双向循环链表的定义2. 哨兵位的作用二、实现双向链表1. 节点结构与接口声明2. 核心接口实现三、顺序表和双向链表的对比分析一、双向链表的结构1. 带头双向循环链表的定义带头双向循环链表是链表中最复杂也最常用的一种结构。它具备三个特征带头存在一个哨兵位节点不存储有效数据双向每个节点既有指向下一个节点的指针next也有指向上一个节点的指针prev循环尾节点的next指向哨兵位哨兵位的prev指向尾节点typedefstructListNode{structListNode*next;// 指向下一个节点structListNode*prev;// 指向上一个节点intdata;// 数据域}LTNode;2. 哨兵位的作用哨兵位节点不保存有效数据只作为链表头尾的标志。它的存在使得空链表不再是NULL而是仅有一个哨兵位节点其next和prev都指向自己遍历链表时不会死循环因为遇到哨兵位即表示遍历结束插入删除操作无需考虑头尾特殊处理逻辑统一二、实现双向链表1. 节点结构与接口声明typedefintLTDataType;typedefstructListNode{structListNode*next;structListNode*prev;LTDataType data;}LTNode;// 创建哨兵位初始化链表LTNode*LTInit();// 销毁链表voidLTDestroy(LTNode*phead);// 打印链表voidLTPrint(LTNode*phead);// 判断链表是否为空仅含哨兵位boolLTEmpty(LTNode*phead);// 尾插 / 尾删voidLTPushBack(LTNode*phead,LTDataType x);voidLTPopBack(LTNode*phead);// 头插 / 头删voidLTPushFront(LTNode*phead,LTDataType x);voidLTPopFront(LTNode*phead);// 在 pos 位置之后插入voidLTInsert(LTNode*pos,LTDataType x);// 删除 pos 位置节点voidLTErase(LTNode*pos);// 查找值为 x 的节点LTNode*LTFind(LTNode*phead,LTDataType x);注意所有接口参数均为哨兵位指针phead无需二级指针因为哨兵位永远固定不变。2. 核心接口实现创建哨兵位初始化LTNode*LTInit(){LTNode*phead(LTNode*)malloc(sizeof(LTNode));if(pheadNULL)exit(-1);phead-nextphead;phead-prevphead;returnphead;}创建新节点LTNode*BuyLTNode(LTDataType x){LTNode*node(LTNode*)malloc(sizeof(LTNode));if(nodeNULL)exit(-1);node-datax;node-nextNULL;node-prevNULL;returnnode;}尾插voidLTPushBack(LTNode*phead,LTDataType x){LTNode*newNodeBuyLTNode(x);LTNode*tailphead-prev;// 哨兵位的 prev 即尾节点tail-nextnewNode;newNode-prevtail;newNode-nextphead;phead-prevnewNode;}头插voidLTPushFront(LTNode*phead,LTDataType x){LTNode*newNodeBuyLTNode(x);LTNode*firstphead-next;phead-nextnewNode;newNode-prevphead;newNode-nextfirst;first-prevnewNode;}尾删voidLTPopBack(LTNode*phead){assert(!LTEmpty(phead));// 不能删除哨兵位LTNode*tailphead-prev;LTNode*prevtail-prev;prev-nextphead;phead-prevprev;free(tail);}头删voidLTPopFront(LTNode*phead){assert(!LTEmpty(phead));LTNode*firstphead-next;LTNode*secondfirst-next;phead-nextsecond;second-prevphead;free(first);}在 pos 之后插入voidLTInsert(LTNode*pos,LTDataType x){assert(pos);LTNode*newNodeBuyLTNode(x);LTNode*nextpos-next;pos-nextnewNode;newNode-prevpos;newNode-nextnext;next-prevnewNode;}删除 pos 节点voidLTErase(LTNode*pos){assert(pos);LTNode*prevpos-prev;LTNode*nextpos-next;prev-nextnext;next-prevprev;free(pos);}打印链表voidLTPrint(LTNode*phead){LTNode*curphead-next;printf(哨兵位 - );while(cur!phead){printf(%d - ,cur-data);curcur-next;}printf(哨兵位\n);}判断空链表boolLTEmpty(LTNode*phead){returnphead-nextphead;}销毁链表voidLTDestroy(LTNode*phead){LTNode*curphead-next;while(cur!phead){LTNode*nextcur-next;free(cur);curnext;}free(phead);}三、顺序表和双向链表的对比分析不同点顺序表双向链表单链表类似存储空间物理上一定连续逻辑上连续物理上不一定连续随机访问支持 O(1)不支持O(N)任意位置插入删除需要搬移元素效率低 O(N)只需修改指针指向 O(1)容量管理需要扩容可能浪费空间或扩容耗时无容量概念按需分配节点缓存友好性好空间局部性强差节点分散缓存命中率低适用场景元素高效存储 频繁随机访问任意位置频繁插入删除总结没有绝对优劣只有是否适合场景。顺序表适合静态数据、频繁查找双向链表适合动态数据、频繁增删。实际开发中两者常配合使用。总结双向链表通过哨兵位和双向指针实现了优雅的循环结构和统一的操作逻辑解决了单链表在删除、反向遍历上的不便。与顺序表相比双向链表在任意位置插入删除上具有天然优势但牺牲了随机访问和缓存性能。掌握双向链表是理解更复杂数据结构如LRU缓存、双向队列的基础建议读者动手实现所有接口并与单链表、顺序表进行对比测试。

相关新闻

传统潮流款库存一定会亏损,编程潮流款二手转售,改款二次销售收益模型,降低滞销亏损。

传统潮流款库存一定会亏损,编程潮流款二手转售,改款二次销售收益模型,降低滞销亏损。

下面给你一份面向"时尚产业与品牌创新"课程的 Python 量化分析小工具——针对潮流款(潮牌卫衣/联名球鞋/限量T恤等)滞销库存,建模"二手转售 改款二次销售"的收益模型,量化其对滞销亏损的削减效果。一、实际应…

2026/6/30 1:23:07阅读更多 →
Agent 核心原理:一篇讲清核心用法

Agent 核心原理:一篇讲清核心用法

这篇不先堆名词。我们把《Agent 核心原理:一篇讲清核心用法》拆成几级台阶,看完至少知道下一步该学什么、该练什么。摘要本文概述文章目标、核心观点和实践价值。之前面试几个想转做大模型应用的候选人,我发现大家有个共同的误区:…

2026/6/30 1:18:06阅读更多 →
# Linux基础指令(二):系统认知与效率

# Linux基础指令(二):系统认知与效率

Linux基础指令(二):系统认知与效率本文是 Linux 基础指令系列的第二篇——在掌握了文件操作之后,我们来理解系统本身:它是怎么运作的,命令到底是什么,以及那些让你效率翻倍的工具和技巧。 上一篇…

2026/6/30 1:18:06阅读更多 →
指针空置类型-nullptr

指针空置类型-nullptr

先看一段代码&#xff1a;#include <iostream> using namespace std;void func(char* p) {cout << "void func(char* p)" << endl;cout << p << endl; }void func(int p) {cout << "void func(int p)" << endl;…

2026/6/30 2:33:11阅读更多 →
开题报告毫无思路,有哪些好用的 AI 论文工具?保姆级实测推荐

开题报告毫无思路,有哪些好用的 AI 论文工具?保姆级实测推荐

每年毕业季&#xff0c;大批本科生、硕博生卡在开题第一步&#xff1a;选题毫无方向、文献综述梳理杂乱、研究框架逻辑断层、写好初稿查重 / AIGC 检测双双超标&#xff0c;熬几个通宵交出的稿子还被导师打回重改。通用 AI 大模型不懂学术规范&#xff0c;写出来的开题空泛无创…

2026/6/30 2:33:11阅读更多 →
Chroma报错chromadb.errors.InvalidArgumentError: Collection expecting embedding with dimension of 1024,

Chroma报错chromadb.errors.InvalidArgumentError: Collection expecting embedding with dimension of 1024,

如标题所示&#xff0c;在使用Chroma存储数据到向量库中后&#xff0c;进行检索操作报错&#xff0c;报错内容为chromadb.errors.InvalidArgumentError: Collection expecting embedding with dimension of 1024, got 1536 但这个错误在我把模型从text-embedding-v1切换为text-…

2026/6/30 2:33:11阅读更多 →
中小型园区网络交付全流程完整解析

中小型园区网络交付全流程完整解析

一、整体交付核心框架 中小型园区网络交付采用行业标准化三段式闭环流程&#xff1a;前期规划设计 → 现场施工部署 → 上线测试验收。整套流程兼顾网络稳定性、内网安全性与后期运维便捷性&#xff0c;广泛适用于企业厂区、小型产业园、院校校区、产业小院等终端规模在50–500…

2026/6/30 2:33:11阅读更多 →
从0x27服务看UDS安全访问:种子与密钥的实战解锁指南

从0x27服务看UDS安全访问:种子与密钥的实战解锁指南

1. 0x27服务与UDS安全访问的核心逻辑 第一次接触汽车电子诊断时&#xff0c;我被ECU上那个小小的锁形图标难住了整整三天。后来才知道&#xff0c;这背后是UDS协议中**安全访问服务&#xff08;0x27&#xff09;**的典型应用场景。简单来说&#xff0c;它就像汽车ECU的"门…

2026/6/30 2:33:11阅读更多 →
1.2 HSA的Topology sysfs 布局与发现机制

1.2 HSA的Topology sysfs 布局与发现机制

摘要&#xff1a; 本文聚焦 KFD Topology 的发现过程——内核如何通过 sysfs 暴露拓扑信息&#xff0c;libhsakmt 如何一次性加载为内存快照&#xff0c;以及 Node ID 映射、generation_id 等辅助机制。各 Properties 的字段详解见后续专题文档。 前文给出了描述异构系统的四个…

2026/6/30 2:28:11阅读更多 →
AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

AI Coding 六个月真实ROI账本:产品经理的血泪教训,研发的冷静忠告

6个月前的2025年12月&#xff0c;Boris Cherny 公开宣布自己卸载了 IDE。一时间&#xff0c;Vibe Coding 成了全行业最热的话题。6个月后&#xff0c;当我们回过头来拉一份真实账本&#xff0c;发现事情远没有"一句话生成一个App"那么浪漫。本文从产品经理和研发两个…

2026/6/29 3:27:55阅读更多 →
审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

审计来了,数据权限全开——审计走了,怎么确保权限全部关掉?

引言&#xff1a;审计结束三个月了&#xff0c;审计员的权限还没关某城商行每年按照监管要求开展至少一次数据安全审计。审计期间&#xff0c;内审部门需要抽样检查各类业务数据——交易流水、客户信息、员工操作日志、权限配置记录。这些数据分布在不同系统中&#xff0c;审计…

2026/6/29 2:19:08阅读更多 →
为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler:技术原理与实战指南

为什么你需要Destiny 2 Solo Enabler&#xff1a;技术原理与实战指南 【免费下载链接】Destiny-2-Solo-Enabler Repo containing the C# and XAML code for the D2SE program. Included is also the dependency for the program, and image asset. 项目地址: https://gitcode…

2026/6/30 0:02:58阅读更多 →
第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

第六章:PowerPoint 2010 核心功能与实战应用 —— 从入门到精通

1. PowerPoint 2010基础操作全攻略 刚接触PowerPoint 2010时&#xff0c;很多人会被它复杂的界面吓到。其实只要掌握几个核心区域&#xff0c;就能快速上手。我最开始用PPT时&#xff0c;经常找不到功能按钮在哪&#xff0c;后来发现主要操作都集中在顶部功能区。 工作窗口主要…

2026/6/30 0:02:58阅读更多 →
XGBoost超参数实战:从理论到调优策略

XGBoost超参数实战:从理论到调优策略

1. XGBoost超参数基础认知 第一次接触XGBoost时&#xff0c;我被它那密密麻麻的参数列表吓到了。这感觉就像面对一架波音747的驾驶舱——每个按钮都可能有神奇的效果&#xff0c;但按错了就可能坠机。经过多年实战&#xff0c;我发现其实掌握十几个核心参数就能解决90%的问题。…

2026/6/30 0:02:59阅读更多 →