跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C算法

数据结构:单向链表的基本操作

数据结构研究数据元素之间的关系,包含逻辑结构与物理结构。线性表分为顺序表和链表。链表通过指针连接节点,包含头指针和头节点。单向链表的基本操作包括创建、头插、尾插、头删、尾删、修改和查找。操作时需注意空链表、单节点边界条件及逻辑与短路特性,确保内存安全与正确性。时间复杂度方面,顺序访问为 O(n),随机访问为 O(1)。

PgDevote发布于 2026/2/27更新于 2026/10/24106 浏览

数据结构基础

基本概念

文章配图

1. 数据

是描述客观事实的符号,是计算机中可以操作的对象,能被计算机识别,并输入给计算机处理的符号集合。

2. 数据对象

性质相同的数据元素集合,是数据的子集。

3. 数据元素

是组成数据的、具有一定意义的基本单位,被计算机当作整体来处理。

4. 数据项

数据不可再分的最小单位。

5. 数据结构研究数据元素之间的关系

逻辑关系(结构):从逻辑上存在的一种联系。 存储关系(结构):存储到计算机的结构。

6. 数据结构的三要素

不同数据元素之间不是独立的,而是存在特定的关系,我们将这些关系称为结构。 包括:逻辑结构、物理结构、算法。


逻辑结构与物理结构

常见的逻辑结构

逻辑结构是指数据对象中数据元素之间的相互关系。

1. 集合结构

数据元素除了同属一个集合之外,它们之间没有必然联系。 文章配图

2. 线性结构

其中的数据元素之间是一对一的关系。 文章配图

3. 树形结构

其中的数据元素之间存在一对多的层次关系。 文章配图

4. 图形结构

其中的数据元素之间是多对多的关系。 文章配图

物理结构

物理结构是指:数据的逻辑结构在计算机中的存储形式。

1. 顺序结构
  1. 定义:是把数据元素存放在地址连续的存储单元里,其数据之间的逻辑关系和物理关系是一致的。 文章配图
  2. 特性:
  • 访问元素方便,时间复杂度为 O(1)
  • 插入和删除不方便
2. 链式结构

把数据元素存放在任意的存储单元里,这组存储单元可以说连续的,也可以是不连续的。 文章配图 2) 特性:

  • 访问元素不便,需要遍历,时间复杂度为 O(n)
  • 插入和删除数据方便
3. 索引结构

根据地址就可以找到对应的关键字。可以理解成一个黄页,你根据一个人的名字,就可以找到他的电话。所以索引存储又被称为直接寻址。数组就是一个常见的索引存储结构,可以通过下标来直接访问。索引表是有序的。

4. 散列结构(哈希结构)

'散列存储'名字中的'散列'就是常听到的 hash(哈希值),hash 是通过一种算法来运算出来的,比如 MD5。在这种存储格式下,地址会通过 hash 算法来运算成一个相同长度的 hash 值,然后存放这个 hash 值,而不是直接存放地址。在访问关键字的时候会通过运算解码 hash 值,然后再访问。


算法

算法是解决问题的步骤,不同的数据结构决定了所对应的算法不同。

1. 特性

输入、输出、有穷性、确定性、可行性。

2. 设计

准正确性、健壮性、可读性、时间和空间效率。

3. 算法好坏的度量——算法效率

时间复杂度、空间复杂度。


线性表

零个或多个数据元素的有限序列。

1. 顺序表

以顺序结构存储的线性表。

2. 链表

  1. 定义:以链式结构存储的线性表。
  2. 特性:
  • 一个节点分为数据域和指针域,数据域存放当前节点的数据部分,指针域存放链表的下一个节点(后继位置)的地址。 文章配图
  • 链表的第一个节点的存储位置叫做头指针,第一个节点叫头节点。线性链表的最后一个节点指针为 NULL。头节点的后一个节点是首节点,头节点的数据域可以不存储任何信息,一般对链表的操作是从首节点开始,但是删除链表的尾删方式是从头节点开始的。 文章配图 文章配图
  • 头指针和头节点的异同 文章配图

链表的基本操作

编写程序时要充分考虑空链表、只有一个有效节点、用户输入数据为 NULL 等特殊情况的排查。在判断条件中要考虑到逻辑与的短路特性,基本操作的前提都是在链表内完成的。

1. 创建链表

指针域的定义如下所示。 文章配图

2. 增加节点

1) 头插

从头部插入,先插入的后输出。例如头插:1, 2, 3, 4;打印输出是:4, 3, 2, 1。

  • Step 1: 创建一个新节点并给值。
  • Step 2: 让新节点指向原首节点:将原首节点的地址存在新节点的指针域。
  • Step 3: 让头节点指向新节点:将新节点的地址存放在头节点指针域中。 Step 2 和 Step 3 的顺序不可以变,如果 Step 3 先操作,头节点的指针域信息会被覆盖,首节点的地址会丢失。 文章配图 文章配图
2) 尾插

从尾部插入,先插入的先输出。例如尾插:1, 2, 3, 4;打印输出是:1, 2, 3, 4。

  • Step 1: 创建一个新节点并给值,将新节点的指针域初始化为 NULL。
  • Step 2: 找到尾节点。
  • Step 3: 链接链表:将新节点的地址存放到当前尾节点的指针域,链接成功后,新节点是新的尾节点。 p_new->pnext = NULL; 必须写,因为此时插入的节点是尾节点,尾节点指针域必须为空。 文章配图

3. 删除节点

1) 头删
  • Step 1: 定义一个指针变量指向首节点。
  • Step 2: 链接节点:让头节点指向即将删除的节点的下一个节点:将首节点的下一个节点地址装入头的指针域。
  • Step 3: 释放 p 所在的空间。 链表只有一个节点时也适用。 文章配图
2) 尾删
  • Step 1: 找到尾节点的前一个节点,由于边界条件的判断需要两次 next,指针 p 必须从头节点(phead)开始遍历,而不是从首节点(phead->pnext)开始,主要是为了安全处理链表只有一个有效节点的边界情况。当头节点作为起始点时,当链表仅有一个节点时,p->pnext->pnext 直接为 NULL,循环不会执行,可直接释放尾节点并更新头节点的指针;若从首节点开始,此时 p 即为尾节点,p->pnext 为 NULL,访问 p->pnext->pnext 会导致对空指针解引用,引发段错误。因此,从头节点出发能统一处理各种节点数量情况,避免非法内存访问。
  • Step 2: 释放尾节点。
  • Step 3: 将尾节点的前一个节点指针域设为 NULL。 文章配图

4. 修改节点

  • Step 1: 从头节点开始比较,找到指定值所在的节点。while((p != NULL) && (p->data != old)) 这里的条件不能调换顺序,因为如果调换为 (p->data != old) && (p != NULL),当 p 为 NULL 时,会先访问 p->data 导致段错误。目前的顺序是正确的,利用了逻辑与的短路特性。
  • Step 2: 将指定节点的值修改为指定值。 以下 if 条件语句中 && (p->data == old) 这个判断是多余的。因为循环结束的条件只有两种可能:
  • p == NULL(遍历完链表没找到)
  • p->data == old(找到了) 所以只要 p != NULL,就一定是找到了目标节点。 文章配图

5. 查找节点

  • Step 1: 从头节点开始遍历查找指定值所在的节点。
  • Step 2: 找到指定节点后返回节点地址,若链表为空或遍历结束未找到则返回 NULL。while 的条件语句也不可以调换顺序,因为逻辑与的短路特性存在,指定值和节点数据域相等的前提应该是在链表内。 文章配图

6. 补充

  1. 判断链表是否为空 在非空链表中,判断链表是否只有一个有效节点是:phead->pnext->pnext == NULL; 文章配图

  2. 遍历打印链表数据域 文章配图

  3. 计算链表长度 文章配图

目录

  1. 数据结构基础
  2. 基本概念
  3. 1. 数据
  4. 2. 数据对象
  5. 3. 数据元素
  6. 4. 数据项
  7. 5. 数据结构研究数据元素之间的关系
  8. 6. 数据结构的三要素
  9. 逻辑结构与物理结构
  10. 常见的逻辑结构
  11. 1. 集合结构
  12. 2. 线性结构
  13. 3. 树形结构
  14. 4. 图形结构
  15. 物理结构
  16. 1. 顺序结构
  17. 2. 链式结构
  18. 3. 索引结构
  19. 4. 散列结构(哈希结构)
  20. 算法
  21. 1. 特性
  22. 2. 设计
  23. 3. 算法好坏的度量——算法效率
  24. 线性表
  25. 1. 顺序表
  26. 2. 链表
  27. 链表的基本操作
  28. 1. 创建链表
  29. 2. 增加节点
  30. 1) 头插
  31. 2) 尾插
  32. 3. 删除节点
  33. 1) 头删
  34. 2) 尾删
  35. 4. 修改节点
  36. 5. 查找节点
  37. 6. 补充

更多推荐文章

查看全部
  • 前端独立产品设计全流程:掌握三大 AI 设计 Skill
  • Java AI 代码最佳实践优化器实测
  • Python 二级考试真题及参考代码解析(简单应用题)
  • 计算机视觉基础与实战应用指南
  • C 语言初阶算法习题实战解析(二)
  • TDuck 开源表单系统私有化部署与数据收集实践
  • 双指针统计有效三角形个数
  • Stable Diffusion 画质增强:Consistency Decoder 使用教程
  • PostgreSQL INSERT INTO 语句详解与实战技巧
  • Telegram 机器人 Token 与 ChatID 获取实战指南
  • Bing Webmaster 工具使用指南:添加、验证与提交站点地图
  • 顺序表模拟实现与洗牌算法应用
  • 越疆机器人 TCP 通讯 12 点标定脚本程序
  • 大模型 SFT 关键点解析与实践指南
  • 豆包 Seedream 4.0 多图融合能力测评:田园犬与三花猫多场景生成
  • Spring Cloud LoadBalancer 负载均衡实战与原理
  • Flutter 三方库 mediapipe_core 的鸿蒙化适配指南
  • C++ 入门进阶:输入输出流、缺省参数与函数重载
  • Webnovel Writer:基于 Claude Code 的长篇网文 AI 创作系统
  • 论文查重与 AIGC 检测技术解析:从痛点到解决方案

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online