【初赛】链表 - Slayer

news/2025/9/19 9:35:10/文章来源:https://www.cnblogs.com/slayer-wt/p/19100136

链表性质知识点总结

链表是一种线性数据结构,其核心特点是数据元素(称为 “节点”)通过指针或引用连接,而非像数组那样存储在连续的内存空间中。这种结构决定了它与数组截然不同的性质,适用于频繁插入 / 删除、内存动态分配的场景。

一、链表的核心定义与结构

  1. 基本构成

链表的最小单元是节点(Node),每个节点包含两部分:

  • 数据域(Data):存储具体的数据(如整数、字符串、对象等);
  • 指针域(Pointer/Reference):存储下一个(或上一个)节点的内存地址,用于建立节点间的连接。
  1. 链表的 “表头” 与 “表尾”
  • 表头(Head):链表的第一个节点,是访问整个链表的入口(若丢失表头,-可能无法访问后续所有节点);
  • 表尾(Tail):链表的最后一个节点,其指针域通常指向 null(空),表示链表的结束(循环链表除外)。

二、链表的主要类型(按结构分类)

  • 单链表:每个节点仅含 “指向后一个节点” 的指针(单向连接),表尾指针指向 null。 结构简单,节点占用内存少。 无法反向遍历;删除中间节点时,需先遍历找到 “前驱节点”(效率低)。

  • 双链表:每个节点含 “指向前驱节点” 和 “指向后继节点” 的两个指针(双向连接)。 可正向 / 反向遍历;删除中间节点时无需遍历找前驱(直接通过前驱指针定位)。 节点占用内存更多(多一个指针域);插入 / 删除时需维护两个指针(逻辑稍复杂)。

  • 循环链表:表尾节点的指针不指向 null,而是指向表头(单循环链表)或前驱节点(双循环链表)。 适合 “环形访问”场景(如约瑟夫环问题);遍历到表尾后可直接回到表头,无需重新定位。 若操作不当易出现 “死循环”;判断链表结束的条件需特殊处理(不能用 null)。

三、链表的核心性质

  1. 节点存储在离散的内存块中(内存可分散在任意位置),节点间通过指针 “串联”,无法通过索引直接定位节点。

  2. 链表:仅支持顺序访问—— 必须从表头开始,逐个通过指针遍历到目标节点,访问第 k 个节点的时间复杂度 O(n)(最坏需遍历所有节点)。

\(\color{red}{不能随机访问}\)

  1. 插入 / 删除操作:效率差异
操作场景 单链表时间复杂度 双链表时间复杂度 原因
表头插入 / 删除 O(1) O(1) 链表仅需修改表头指针。
中间节点插入 / 删除 O(n) O(1) 单链表需找前驱;双链表直接通过前驱 / 后继指针修改。
表尾插入 / 删除 O(n) O(1) 单链表需遍历到表尾;双链表直接通过表尾指针操作。
  1. 节点按需动态分配(插入时申请、删除时释放),内存利用率高,无固定大小限制。

  2. 优缺点

  • 操作效率

    • 表头 / 中间插入 / 删除效率高(无需移动元素);
    • 动态扩容灵活。
  • 内存管理

    • 内存按需分配,无固定大小限制。
  • 操作效率

    • 不支持随机访问,查询效率低(O(n));
    • 需额外存储指针,内存开销大。
  • 内存管理
    手动管理内存语言(如 C/C++)易出现内存泄漏。

四、链表的常见操作与时间复杂度

操作 单链表时间复杂度 双链表时间复杂度 核心思路
遍历链表 O(n) O(n) 从表头开始,沿指针逐个访问,直至表尾(循环链表需判断是否回到表头)。
查找指定元素 O(n) O(n) 遍历链表,对比节点数据域,匹配则返回节点。
表头插入 O(1) O(1) 新节点指针指向原表头 → 更新表头为新节点。
表尾插入 O(n) O(1) 单链表遍历到表尾;双链表直接通过表尾指针挂载新节点。
中间节点删除 O(n) O(1) 单链表找前驱节点后修改指针;双链表直接修改目标节点的前驱 / 后继指针。
链表反转 O(n) O(n) 单链表用 “三指针法”(prev/curr/next)逐节点反转;双链表需同时反转前驱 / 后继指针。
环检测 O(n) O(n) 快慢指针法:快指针走 2 步,慢指针走 1 步,相遇则存在环。

五、链表的典型应用场景

  1. 实现栈 / 队列:
    • 栈:表头作为栈顶,push/pop 均为 O(1);
    • 队列:双链表表头为队头、表尾为队尾,enqueue/dequeue 均为 O(1)(避免数组队列 “假溢出”)。
  2. 哈希表冲突解决:
    链地址法中,用链表存储哈希值相同的元素,解决哈希冲突
  3. 动态数据存储:
    如实时任务列表、购物车商品(需频繁添加 / 删除,数据量不固定)。
  4. 环形场景:
    如约瑟夫环问题、循环调度(用循环链表实现环形访问逻辑)。

六、关键易错点

空指针异常:遍历或操作时未判断 null(如访问表尾后的空指针);
死循环:循环链表未正确判断遍历终止条件(如未检测是否回到表头);
内存泄漏:手动管理内存语言(C/C++)中,删除节点后未释放内存;
双链表指针维护遗漏:插入 / 删除时未同时更新 “前驱” 和 “后继” 指针,导致链表断裂。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/907656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纷享销客CRM系统自定义APL代码破解企业深度定制难题

在许多中大型企业,尤其是央企、金融、高科技等行业,对 CRM 系统提出了更为复杂的业务流程定制需求。尽管零代码、低代码配置工具有一定的灵活性,但在面对高度复杂、深度融合业务逻辑的安全机制或特殊流程时,仍显乏…

深入解析:Kafa面试经典题--Kafka为什么吞吐量大,速度快

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第2章 zynq开发板FSBL的生成和NAND烧录

前言 由于本人较懒,记录主要是过程,由于zynq的比stm32做的人少很多,资料也少很多,我会简要介绍原理,操作流程主要由图片加少量文字组成,每一章都是在之前的章节基础上做的一、新建FSBL工程 打开vivado,打开SDK打…

工具大全

<!DOCTYPE html> <html lang="zh-CN"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1.0"/&…

RocketMQ vs kafka

目录背景和价值1. 更激进的“零拷贝”技术2. 更简洁的存储模型3. 更“粗糙”但高效的批处理4. 权衡取舍的可靠性保证对比总结参考资料 背景和价值 你这个问题非常好,直击了两者设计哲学的核心差异。 简单来说,Kafka …

JL-32 土壤速测仪 手持便携 大容量 多参数可同时监测

JL-32 土壤速测仪 手持便携 大容量 多参数可同时监测产品概述 土壤速测仪是一款携带方便,操作简单,集采集与存储于一体的可移动式观测仪器。由手持式速测主机、土壤类传感器、USB数据线、电源适配器、便携式手提箱等…

el-date-picker时间选择器限制时间跨度为3天 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Android--资料

Android--资料 Android Studio 的 10 个使用技巧 Android中的Radio模糊查询AutoCompleteTextView简单使用 Android基础入门:搜索框组件SearchView Android studio设置jdk版本项目设置和全局设置 三种实现…

直播录制神器!一款多平台直播流自动录制客户端!

StreamCap —— 一个基于 FFmpeg 和 StreamGet 的多平台直播流录制客户端,覆盖 40+ 国内外主流直播平台,支持批量录制、循环监控、定时监控和自动转码等功能。大家好,我是 Java陈序员。 现如今,观看直播已成为日常…

101.计组--二章

101.计组--二章数据的表示和运算 "自六月份另一个学校毕业 已经有拖三个多月的计组学习 当时其实已经已有一些学习 仅仅差了一节内容结束 也确实因为这个复杂的运算各类东西 言归正传 新的学校 新的学习 开始总结…

LobeChat搭建

docker search lobe-chat docker pull lobehub/lobe-chat docker run -d -p 3210:3210 -e ACCESS_CODE=lobe66 --name lobe-chat lobehub/lobe-chat本文来自博客园,作者:潇汀,转载请注明原文链接:https://www.cn…

推荐几家国外的AI模型应用网站

一、聊天 1、OpenAI——ChatGPT 网址:https://chatgpt.com/ 简介:OpenAI 开发的对话式AI模型,擅长自然语言处理,能回答问题、创作内容和提供学习支持。 实际体验: 对话聊天式AI的引领者,综合能力很强,从发布至今…

【maven01】依赖管理的工具 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

长园智能装备遇上利驰SuperHarness-3D,实现充电桩线束设计效率与精度双提升!

利驰数字线束软件,赋能长园智能装备充电桩线束智造。设计案例:​感谢南瑞、盛弘、长园等众多充电桩龙头企业,选择利驰数字线束[抱拳][抱拳][抱拳]

学习笔记:操作分块 / 根号重构

感谢校内模拟赛给我强行灌输了这个东西。。。 概述 操作分块 / 根号重构,又名时间轴分块,可以解决需要多次修改和查询的问题,常常难以直接维护。 借鉴序列分块的思想,我们设定一个阈值 \(B\),将连续 \(B\) 次操作…

url测试脚本2

!/bin/sh . /etc/init.d/functions 待检测的 URL 列表 array=( "http://blog.oldboyedu.com" "http://blog.etiantian.org" "http://oldboy.blog.51cto.com" "http://10.0.0.7&quo…

运动控制教学——5分钟学会机器人运动学! - 实践

运动控制教学——5分钟学会机器人运动学! - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas",…

url测试脚本3

!/bin/sh . /etc/init.d/functions 待检测的 URL 列表 array=( "http://mail.163.com" "http://mail.sina.com/" ) 等待效果,输出进度 wait_for_start() { echo -n "Start Curl_check"…

深入解析:linux基本知识

深入解析:linux基本知识pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &q…

解决方案架构师是做什么

解决方案架构师 面试题 客户是怎么管理的 渠道变革变换的是哪些内容。变的是什么? 分层分级是怎么设计,价格体系是怎么制定的 marking 是怎么做的? CAP模型,是怎么管理的, 营销活动和销售是如何结合的,IT解决方案…