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

单链表综合练习:删除指定值节点、反转链表及查找中间节点

链表是数据结构核心考点。涵盖删除指定值节点、反转链表、查找中间节点三大高频题型。通过新链表尾插法实现删除操作;利用三指针法逐步反转链表;采用快慢指针高效定位中间节点。提供清晰代码示例与算法原理图解,帮助掌握链表核心操作逻辑,夯实指针功底。

Stephaine Walsh发布于 2026/3/29更新于 2026/6/318 浏览
单链表综合练习:删除指定值节点、反转链表及查找中间节点

前言

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

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

1.1 题目

链接:删除链表中等于给定值 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 题目

链接:反转链表

算法示意图

2.2 算法原理

反转过程图

注 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 题目

链接:链表中间节点

算法示意图

3.2 算法原理

核心思想:快慢指针(2*slow == fast)

快慢指针图

注意:不能 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 代码
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Linux 网络编程:理解 Web 路径与实现简单 HTTP 服务
  • 基于 Llama-Factory 部署微调大模型 API 服务实战
  • AI 生成论文参考文献存在幻觉风险,如何确保引用真实可靠?
  • Go 语言实现 Doomsday 末日算法
  • Xinference v1.17.1 基于 GitHub Codespaces 的云端 WebUI 快速部署
  • 文心一言 4.5 开源模型深度解析:轻量化部署与中文优化
  • 华为 OD 技术面试:C++ 核心考点与特性解析
  • 鸿蒙(HarmonyOS)应用开发学习路线图与核心资料指南
  • Spring Boot 集成本地 OCR 服务模块实战
  • OpenClaw 技能精选:本地 AI 助手超级插件市场指南
  • 前缀和算法实战:寻找中心下标与除自身外乘积
  • Docker 安装及基础操作
  • Gdspy Python 芯片设计库安装与使用指南
  • 基于 Leaflet 和天地图的免费运动场所 WebGIS 可视化
  • Android 开发中 Kotlin 架构演进:从 MVC 到 MVVM
  • 几种典型的 Python 兼职开发途径与实战思路
  • 发那科机器人与西门子 PLC 通讯方案:网关与 Modbus TCP 配置及代码
  • K-RagRec:基于知识图谱检索增强生成的 LLM 推荐系统
  • Linux 编译器 GCC/G++ 深度解析
  • C++ 红黑树封装实战:从零实现 Map 与 Set

相关免费在线工具

  • 加密/解密文本

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