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

数据结构 —— 链表

在数据结构体系中顺序表与链表是两大最基础的线性存储结构。顺序表依靠连续内存实现随机访问但插入、删除中间元素效率低下而链表用离散内存 指针连接的方式完美解决了顺序表的痛点是 Linux 内核、操作系统、网络编程中高频使用的数据结构。本文从零拆解链表的底层原理、分类、完整实现、核心优缺点、与顺序表的对比同时结合 Linux 内核使用场景彻底吃透面试高频考点。一、先搞懂什么是链表1.1 链表的核心定义链表是非连续、非顺序的线性表它不要求内存连续通过 ** 指针引用** 将分散在堆内存中的一个个节点串联起来。每个节点包含两部分数据域存储业务数据指针域存储下一个节点的内存地址节点分散在内存各处不连续排列靠指针维系前后关系没有下标不支持随机访问只能从头节点开始逐个遍历你可以把链表想象成一串带钩子的珠子每个珠子存数据同时带一个钩子勾住下一颗珠子珠子不用挨在一起靠钩子串联想要找到第 N 颗珠子必须从第一颗顺着钩子依次找。1.2 链表的四大分类日常开发 面试中链表分为 4 种层层递进单链表最基础只有后继指针只能从头往后遍历双向链表有前驱 后继两个指针可双向遍历Linux 内核高频使用循环链表尾节点指针指向头节点首尾相连双向循环链表双向 循环功能最全内核 list_head 底层就是它1.3 链表与顺序表的核心对立点顺序表连续内存、随机访问快、中间增删慢、缓存友好链表离散内存、随机访问慢、任意位置增删快、缓存不友好二、单链表底层原理与完整实现单链表是链表的基础我们用 C 手写一个极简单链表彻底搞懂底层逻辑。2.1 节点结构定义// 链表节点 template typename T struct ListNode { T val; // 数据域存储数据 ListNode* next; // 指针域存下一个节点地址 ListNode(T v) : val(v), next(nullptr) {} };val存放业务数据next指向下一个节点末尾节点 next 为nullptr2.2 单链表核心操作1. 头插O (1)在头部插入节点只需要修改指针是链表效率最高的插入方式。void push_front(T val) { ListNodeT* new_node new ListNodeT(val); new_node-next head; // 新节点指向原头节点 head new_node; // 头指针更新为新节点 }2. 尾插O (n)需要遍历到链表尾部才能插入节点。void push_back(T val) { ListNodeT* new_node new ListNodeT(val); if(head nullptr) { head new_node; return; } // 遍历到尾节点 ListNodeT* cur head; while(cur-next ! nullptr) cur cur-next; cur-next new_node; }3. 指定位置插入O (n)找到前驱节点修改指针指向不需要移动任何元素。void insert(int pos, T val) { // 找到pos前一个节点 ListNodeT* cur head; for(int i0; ipos-1; i) cur cur-next; ListNodeT* new_node new ListNodeT(val); new_node-next cur-next; cur-next new_node; }4. 删除节点O (n)找到前驱节点跳过目标节点释放内存即可无需移动元素。void erase(int pos) { ListNodeT* cur head; for(int i0; ipos-1; i) cur cur-next; ListNodeT* del cur-next; cur-next cur-next-next; delete del; // 释放堆内存避免内存泄漏 }5. 遍历查找O (n)链表没有下标必须从头节点逐个往后遍历无法直接跳转。2.3 单链表致命缺点只能单向遍历无法反向查找尾插 / 尾删效率极低需要遍历整个链表删除当前节点必须找到它的前驱节点操作繁琐三、双向链表Linux 内核最爱3.1 底层原理双向链表在单链表基础上给每个节点增加前驱指针 prevtemplate typename T struct DListNode { T val; DListNode* prev; // 前驱指针指向前一个节点 DListNode* next; // 后继指针指向后一个节点 };每个节点可找到前驱、后继支持双向遍历尾插、尾删、删除当前节点效率直接提升到 O (1)Linux 内核、epoll 就绪队列、进程调度队列全部使用双向链表3.2 核心优势可正向、反向双向遍历已知当前节点可直接删除无需遍历找前驱头插、尾插、头删、尾删全部 O (1)3.3 缺点每个节点多存一个指针内存开销比单链表大四、循环链表 双向循环链表4.1 循环链表尾节点的next指针不再置空而是指向头节点首尾相连。优势从任意节点都可遍历整个链表适合环形场景环形队列缺点遍历结束条件从nextnullptr变为nexthead容易死循环4.2 双向循环链表Linux 内核 list_head双向 循环功能最全、使用最广。内核中实现不存储数据只存两个指针嵌入任意结构体中通用型极强epoll 的就绪队列、进程 task_struct 调度队列、定时器队列全部基于此实现五、链表核心优缺点面试必背优点增删效率极高任意位置插入 / 删除节点只需要修改指针无需移动大量元素O (1) 时间复杂度已知节点内存利用率高按需分配节点没有顺序表的预留冗余内存无内存浪费内存离散存储不需要连续的大块内存碎片化内存也能使用适配海量动态连接场景缺点不支持随机访问只能顺序遍历查找元素 O (n)速度远慢于顺序表缓存命中率低节点内存离散CPU 缓存无法预加载顺序遍历也比顺序表慢额外内存开销每个节点需要存储指针内存占用比顺序表高容易内存泄漏节点手动 new 创建忘记 delete 会造成内存泄漏六、顺序表 vs 链表终极对比面试必背表格特性顺序表链表内存分布连续内存离散内存随机访问支持O (1)不支持O (n)头部 / 中间增删O (n)需移动元素O (1)仅修改指针尾部增删O (1)均摊双向链表 O (1)单链表 O (n)CPU 缓存缓存友好速度快缓存不友好速度慢内存开销低无指针冗余高每个节点带指针适用场景查找多、增删少增删多、查找少场景选择口诀频繁查询、极少增删 → 选顺序表vector频繁插入删除、动态扩容 → 选链表Linux 内核、高并发队列 → 选双向循环链表七、链表在 Linux 网络编程中的实际应用链表不是纸上谈兵在你学习的 IO 复用、高并发服务器中无处不在epoll 就绪队列epoll 内核中用双向链表存储就绪的 fd 事件epoll_wait 直接取链表头部O (1) 获取就绪事件进程 / 线程管理Linux 内核用双向链表串联所有进程、线程调度时快速增删节点定时器管理网络服务的定时器心跳、超时检测用链表管理超时事件日志系统日志缓冲区、异步队列常用链表实现动态节点增删八、高频面试总结单链表单向遍历头插 O (1)尾插 O (n)实现简单功能有限双向链表双向遍历头尾操作 O (1)Linux 内核主流使用循环链表首尾相连适合环形结构双向循环链表功能最全epoll、内核调度核心数据结构核心区别顺序表胜在查询链表胜在增删顺序表缓存友好链表动态灵活

相关文章:

数据结构 —— 链表

在数据结构体系中,顺序表与链表是两大最基础的线性存储结构。顺序表依靠连续内存实现随机访问,但插入、删除中间元素效率低下;而链表用离散内存 指针连接的方式,完美解决了顺序表的痛点,是 Linux 内核、操作系统、网络…...

讲讲IO复用三个函数的底层逻辑

在 Linux 网络编程中,IO 复用是高并发服务的核心基石。我们熟知的 Nginx、Redis、日志服务、后端网关,全部都是基于 IO 复用实现高并发。很多同学只会用 select / poll / epoll 这三个函数,但完全不懂内核底层到底发生了什么,遇到…...

2026亲测:专业降AI率工具选这款就对了3秒改写无痕迹

2026 年降 AIGC 工具已从“基础语义替换”进化为多维度智能优化系统,核心评估指标涵盖 AI 痕迹清除效率、专业表达准确性、格式结构完整性、长段落逻辑稳定性、内容重合度降低效果及高校检测平台兼容性。本次测评深入分析 5 款主流工具,测试范围包括中英…...

2026这6款宝藏降AIGC平台大起底,一键把AI检测率精准控到安全区!

步入 2026 年,学术圈的风向早已不是过去那个简单的“降重”时代。随着 AI 技术的迅猛发展,论文查重系统不断升级,高校对 AI 生成内容的审查标准也愈发严苛。曾经只需关注重复率的你,现在却要面对更复杂、更隐蔽的 AIGC 检测压力。…...

效率直接起飞 2026 最新!降AIGC工具测评与推荐

2026年真正好用的AI论文降重与改写工具,核心看降重效果、去AI味、格式保留、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 …...

如何快速掌握ElegantBook:面向初学者的LaTeX书籍排版终极指南

如何快速掌握ElegantBook:面向初学者的LaTeX书籍排版终极指南 【免费下载链接】ElegantBook Elegant LaTeX Template for Books 项目地址: https://gitcode.com/gh_mirrors/el/ElegantBook ElegantBook是一款专为学术书籍排版设计的优雅LaTeX模板&#xff0c…...

从CRUD到AI:普通程序员转型大模型应用开发指南(收藏版)

本文针对有3-5年Java、前端或PHP开发经验的程序员,探讨了如何转型AI大模型应用开发。文章指出,虽然表面看起来与现有工作不同,但CRUD经验反而是转型优势,如API调用、业务流程理解、数据库知识和调试能力等。转型只需掌握Python基础…...

通信对抗新利器:HWG1在铁路高速领域的卓越应用

在现代化交通体系中,铁路、高速等关键领域的通信安全至关重要。为了应对复杂多变的电磁环境,确保通信系统的稳定运行,成都鼎讯信通科技有限公司推出了通信信号干扰模拟器HWG1,为交通领域的通信对抗训练提供了强有力的支持。HWG1通…...

2026 年 AI 毕业论文工具横评:okbiye 领衔,9 款工具实测对比,帮你避开 90% 的写作坑

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT毕业论文 - Okbiye智能写作https://www.okbiye.com/ai/bylw 一、前言:AI 写论文,别只盯着 “一键生成” 毕业论文写作,是每个大学生都绕不开的关卡。从选题定方向、…...

taotoken多模型聚合平台为matlab开发者提供稳定ai能力

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 taotoken多模型聚合平台为matlab开发者提供稳定ai能力 对于使用MATLAB进行数据分析、仿真建模或算法开发的工程师和研究人员而言&a…...

Unity接入海康UMP流全流程:签名认证、HTTP长连接与自定义渲染

1. 这不是简单的“拉流”,而是一场跨协议、跨权限、跨引擎的精准对接你有没有试过在Unity里直接填一个RTSP地址,比如rtsp://admin:123456192.168.1.64:554/Streaming/Channels/101,然后点播放——结果黑屏、报错、卡死,或者更糟&a…...

LNK2001 无法解析的外部符号 “public: static struct QMetaObject const UIDPrintPage::staticMetaObject“

排查一早上的问题,不知道设置哪里出了这个问题,突然提示无法生成Qt的元对象moc_对应的文件,所以这里查找问题根源,语法错误还是路径设置等问题。最终定位还是文件属性设置有问题,估计是改了那些设置吧,最终…...

VIVE Focus3 Unity开发避坑指南:JDK11.0.22与Wave SDK 4.2集成要点

1. 这不是SDK安装教程,而是新手在Focus3上摔的前七跤Unity新手刚拿到VIVE Focus3设备,满心欢喜点开VIVE Developer Portal下载SDK 4.2,解压、导入、Build、Run——然后卡在黑屏、报错、手势没反应、手柄漂移、甚至Unity编辑器直接崩溃。我带过…...

VIVE Focus3 Unity开发避坑指南:SDK 4.2与XR插件深度适配

1. 这不是SDK安装,而是给Unity项目“接上神经末梢” 刚拿到VIVE Focus3设备时,我把它连上电脑,打开Unity 2021.3.33f1(LTS版),照着官网文档点开Package Manager——结果卡在“Loading...”三分钟&#xff0…...

Unity AI工作流实战指南:从Editor到运行时的稳定集成

1. 这不是“AI插件合集”,而是Unity开发者真正用得上的智能工作流Unity开发者每天面对的,从来不是“要不要用AI”,而是“哪个AI功能能让我今天少改三遍材质球、少跑两次Build、少被美术追着问‘这个Shader为什么在iOS上黑一块’”。我做Unity…...

非科班本科,3年从零基础到AI工程师,我的真实转行之路(附避坑指南)

大家好,我是一名普通的非科班本科生,专业是机械制造及自动化,如今已经在AI行业深耕3年,成为了一名能独当一面的AI工程师,还参与过OpenClaw、DeerFlow等国际开源项目,算是真正从“AI小白”逆袭成了行业从业者。 写这篇文章,不是为了炫耀,而是因为我太懂那种“想转行AI却…...

Unity构建性能分析工具:四层数据采集与包体优化实战

1. 这不是又一个“构建日志查看器”,而是一把能切开Unity构建黑箱的手术刀 我第一次在客户项目里看到Build Report Tool时,它正安静地躺在一个被遗忘的Plugins文件夹里,名字叫 BuildReportTool_v2.3.1.unitypackage 。当时团队正为一个中型…...

FRED的光路和光路历史记录

对于杂散光分析,通常会使用“高级光线追迹”对话框,并选择“创建/使用光线历史文件”和“确定光路”选项。下面是对这两个选项的简要解释。确定光线路径选择此选项会使得FRED存储所有光路信息。这允许用户之后使用诊断工具,如光路追迹路径报告…...

cPanel认证安全机制与真实漏洞识别指南

我不能按照您的要求生成关于“CVE-2026-41940 cPanel认证绕过漏洞”的博文内容。 原因如下: 该CVE编号为虚构编号 : CVE编号遵循严格规则,由MITRE官方或授权CNAs(CVE Numbering Authorities)分配。截至2024年7月&a…...

用 jose 正确实现 JWT 签发、验签与密钥轮换

1. 为什么你写的 JWT 总是“看起来能用,上线就出事”JWT(JSON Web Token)这东西,我第一次在项目里用的时候,也是照着文档抄了三行代码:jwt.sign(payload, secret)、jwt.verify(token, secret)、res.json({ …...

Playwright Python3.7+安装失败根因与一次成功配置指南

1. 为什么Playwright在Python3.7环境下总“装不上”?——这不是你的pip问题,是环境认知偏差 你刚在新配的Mac M2上敲下 pip install playwright ,终端卡在 Building wheel for playwright... 十分钟不动;或者Windows上反复提示…...

LLM、Agent与Multi-Agent全面对比:优势、劣势与应用场景分析

引言大语言模型(Large Language Model,LLM)的出现,让机器具备了前所未有的语言理解和生成能力。然而,单纯的LLM就像一个博学但困在图书馆里的学者——它能回答问题、撰写文章,却无法主动采取行动。于是&…...

Appium环境搭建:Java/Node.js/ADB/Xcode可信三角验证指南

1. 为什么“Appium环境搭建”不是配置清单,而是项目生死线 很多人把Appium环境搭建当成一个“照着文档敲几行命令”的入门动作,甚至觉得“不就是装个Java、Android SDK、Node.js,再下个Appium Desktop点开就行?”——我去年带三个…...

Firefox渗透测试插件工作流:15款高价值安全工具实战指南

1. 这不是普通浏览器插件推荐,而是一套可落地的渗透测试辅助工作流 “火狐插件”四个字在安全从业者耳中,常被默认为“轻量级、临时性、辅助性”的代名词——很多人装完Hackbar就以为自己有了渗透入口,点开FoxyProxy调个代理就当完成了环境隔…...

火狐渗透插件实战指南:15款专业工具高效赋能Web侦察与漏洞验证

1. 这不是普通浏览器插件合集,而是渗透测试人员的“外挂式侦察兵” 很多人第一次看到“火狐插件做渗透测试”这个说法,第一反应是:浏览器插件能干啥?改个User-Agent?抓个Cookie?顶多算个辅助小工具。我2016…...

在昇腾NPU上写NumPy代码是种什么体验?asnumpy实战踩坑全记录

前言 最近项目需要在昇腾NPU上跑一些数值计算,不是训练模型,就是纯算东西——矩阵分解、特征值、随机采样之类的。一开始我想,NumPy代码直接跑不就行了? 不行。NumPy跑在CPU上,数据要从NPU搬回CPU才能算,…...

DeepSeek-V4 详细解读

一、核心突破与整体定位 DeepSeek-V4 是 2026 年 4 月发布的新一代开源大模型,核心目标是解决长上下文的工程化落地难题,通过架构、训练和推理的全栈优化,实现了 "百万上下文能用、好用、日常用"。 整体技术路线 DeepSeek-V4 基于 "Transformer + DeepSeek…...

为OpenClaw智能体工作流配置稳定可靠的大模型后端

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为OpenClaw智能体工作流配置稳定可靠的大模型后端 在构建基于OpenClaw的自动化工作流时,一个稳定、可管理的大模型后端…...

Unity背包系统设计终极指南:ScriptableObject+事件总线+对象池

1. 为什么“背包系统”不是功能模块,而是游戏世界的呼吸节奏 在Unity项目里,我见过太多团队把背包系统当成一个“做完就扔”的中间件:美术给图标、策划填Excel表格、程序写个List 塞进UI面板,跑通基础增删就打上✅。结果呢&#x…...

Unity背包系统架构设计:数据驱动、事件总线与三层物品模型

1. 为什么“背包系统”不是功能模块,而是游戏体验的神经中枢 很多人第一次在Unity里拖一个Panel、加几个Image和Text,就以为背包做完了。我见过太多项目——美术资源堆得漂亮,UI动效拉满,结果点开背包,物品不能拖拽、堆…...