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

数据结构与算法:单链表综合练习(删除节点、反转、找中间节点)

单链表操作是数据结构核心考点。三种高频题型:通过尾插法构建新链表删除指定值节点;利用三指针迭代反转链表结构;使用快慢指针技巧定位链表中间节点。提供 C 语言代码实现及原理图解,帮助掌握指针操作逻辑。

极客工坊发布于 2026/2/9更新于 2026/10/23109 浏览
数据结构与算法:单链表综合练习(删除节点、反转、找中间节点)

数据结构与算法:单链表综合练习

链表是 C 语言和数据结构学习的核心考点,也是编程入门绕不开的经典题型。本文聚焦删除指定值节点、反转链表、查找中间节点三大高频链表题,从算法原理到代码实现逐拆解,用通俗易懂的逻辑和清晰的代码示例,帮你吃透链表操作的核心思路。

一、删除链表中等于给定值 val 的所有节点

1.1 题目

题目来源: LeetCode 删除链表中等于给定值 val 的所有节点

1.2 算法原理

创建一个新链表,遍历原链表,把不等于 val 值的节点尾插到新链表中,最后返回新链表。

1.3 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;

struct ListNode* removeElements(struct ListNode* head, int val) {
    ListNode* newhead = NULL;
    ListNode* newtail = NULL;
    ListNode* pcur = head;
    while (pcur) {
        if (pcur->val != val) {
            if (newhead == NULL) // 链表为空
                newhead = newtail = pcur;
            else {
                newtail->next = pcur;
                newtail = pcur;
            }
        }
        pcur = pcur->next;
    }
    if (newtail)
        newtail->next = NULL;
    return newhead;
}

二、反转链表

2.1 题目

题目来源: LeetCode 反转链表

2.2 算法原理

使用三指针法逐步反转链表结构。

  • n1 指向当前节点的前驱(初始为 NULL)
  • n2 指向当前节点(初始为 head)
  • n3 指向当前节点的后继(用于暂存,防止断链)

注 1:n3 会最先指向 NULL 所以要特判; 注 2:链表可能为空,为空直接返回;

2.3 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;

struct ListNode* reverseList(struct ListNode* head) {
    // 链表为空
    if (head == NULL)
        return head;
    
    ListNode* n1 = NULL;
    ListNode* n2 = head;
    ListNode* n3 = head->next;
    
    while (n2) {
        n2->next = n1;
        n1 = n2;
        n2 = n3;
        if (n3)
            n3 = n3->next;
    }
    return n1;
}

三、链表中间节点

3.1 题目

题目来源: LeetCode 链表中间节点

3.2 算法原理

核心思想:快慢指针(fast 速度是 slow 的两倍)。

当 fast 到达末尾时,slow 刚好在中间。

注意:不能 fast->next && fast,当遇到偶数链表会造成对空指针解引用。

3.3 代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
typedef struct ListNode ListNode;

struct ListNode* middleNode(struct ListNode* head) {
    ListNode* slow = head;
    ListNode* fast = head;
    
    while (fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

目录

  1. 数据结构与算法:单链表综合练习
  2. 一、删除链表中等于给定值 val 的所有节点
  3. 1.1 题目
  4. 1.2 算法原理
  5. 1.3 代码
  6. 二、反转链表
  7. 2.1 题目
  8. 2.2 算法原理
  9. 2.3 代码
  10. 三、链表中间节点
  11. 3.1 题目
  12. 3.2 算法原理
  13. 3.3 代码

更多推荐文章

查看全部
  • Stable Diffusion 三种安装部署方案详解
  • AI 安全实战:基于 PGD 的 Stable Diffusion 视觉提示词注入攻击分析
  • Java 服务端核心技术面试核心知识点清单
  • Java 反射机制详解:从原理到实践
  • Python 副业渠道推荐与接单注意事项
  • 基于 YOLOv5 的智能目标检测与自动锁定系统
  • TS2320 错误的本质、触发场景与在 Angular / RxJS 项目中的系统化应对
  • Vue 事件修饰符
  • 基于 Streamlit 快速搭建腾讯混元 LLM 聊天应用
  • 前端大数据导出优化:解决 Chrome 内存崩溃的实战方案
  • C++ 哈希表核心解析:冲突解决与实现细节
  • Python 从零实现简单神经网络算法:原理与代码详解
  • MCP 协议详解:与 Function Call 的区别及 Python 实战
  • LangChain 速成课程:构建基于 OpenAI LLM 的应用
  • 人工智能模型评估:核心指标与方法体系
  • 企业级图像 AIGC 技术观察:Seedream 4.0 能力与应用场景分析
  • MySQL 权限管控与 C/C++ 客户端接入实战指南
  • Python GUI 可视化设计:3 步完成专业界面开发
  • AI 在前后端开发中的差异化落地指南:DAU 规模分层策略
  • llama.cpp 重大更新:内置 Web UI,性能超越 Ollama,本地大模型部署新选择

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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