跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C算法

单链表综合实战:删除指定节点、反转链表与查找中间节点

单链表是数据结构基础,删除指定值节点、反转链表及查找中间节点三大高频考点。通过尾插法构建新链表实现删除,利用三指针迭代完成反转,借助快慢指针定位中点。代码含详细注释与边界处理,助您夯实指针操作能力。

极光发布于 2026/3/21更新于 2026/5/75 浏览
单链表综合实战:删除指定节点、反转链表与查找中间节点

前言

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

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

题目

给定一个链表的头节点 head 和一个整数 val,请你删除链表中所有满足 node.val == val 的节点,并返回新的头节点。

算法原理

处理链表删除时,直接修改原链表往往需要特殊处理头节点的情况(比如头节点就是要删的值)。这里采用一种更稳健的思路:创建一个新链表,遍历原链表,把不等于 val 的节点依次尾插到新链表中。这样逻辑统一,不需要单独判断头节点是否被删除。

代码实现

/**
 * 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;
}

二、反转链表

题目

给你单链表的头节点 head,请你反转链表,并返回反转后的链表。

算法原理

反转链表的核心在于改变节点的 next 指向。最直观的方法是使用三个指针:prev(前驱)、curr(当前)、next(后继)。

  1. 初始时,prev 为 NULL,curr 为头节点。
  2. 在循环中,先保存 curr->next 到 next,防止断链。
  3. 将 curr->next 指向 prev,完成局部反转。
  4. 移动 prev 和 curr 向后推进。
  5. 当 curr 为空时,prev 即为新的头节点。

注意:如果链表为空,直接返回;遍历时务必先备份下一个节点,否则链表会断裂。

代码实现

struct ListNode* reverseList(struct ListNode* head) {
    // 链表为空直接返回
    if (head == NULL) return head;

    ListNode* prev = NULL;
    ListNode* curr = head;
    ListNode* next = head->next;

    while (curr) {
        curr->next = prev; // 反转指针方向
        prev = curr;       // 前驱后移
        curr = next;       // 当前后移
        if (next) {
            next = next->next; // 备份下一个节点
        }
    }
    return prev;
}

三、链表中间节点

题目

给定一个头节点为 head 的非空单链表,返回链表的中间节点。如果有两个中间节点,则返回第二个中间节点。

算法原理

这是经典的快慢指针问题。定义两个指针 slow 和 fast,都从头节点出发。

  • slow 每次走一步。
  • fast 每次走两步。

当 fast 到达链表末尾时,slow 恰好位于中间位置。对于偶数长度链表,fast 走到最后一个节点时停止,此时 slow 指向第二个中间节点,符合题目要求。

关键点:循环条件必须同时检查 fast 和 fast->next,避免访问空指针导致崩溃。

代码实现

struct ListNode* middleNode(struct ListNode* head) {
    ListNode* slow = head;
    ListNode* fast = head;

    // 只要 fast 不为空且 fast 的下一个节点也不为空,就继续走
    while (fast && fast->next) {
        slow = slow->next;
        fast = fast->next->next;
    }
    return slow;
}

总结

本文解析了链表操作的三大高频题型:删除指定值节点、反转链表、查找中间节点。通过新链表尾插法实现删除操作,避免了复杂的边界判断;利用三指针迭代逐步反转链表,确保指针不丢失;采用快慢指针高效定位中间节点。代码示例清晰,附详细算法原理说明,帮助掌握链表核心操作逻辑。这些基础题型是提升指针运用能力和数据结构理解的关键,建议结合图示反复练习。

目录

  1. 前言
  2. 一、删除链表中等于给定值 val 的所有节点
  3. 题目
  4. 算法原理
  5. 代码实现
  6. 二、反转链表
  7. 题目
  8. 算法原理
  9. 代码实现
  10. 三、链表中间节点
  11. 题目
  12. 算法原理
  13. 代码实现
  14. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • LazyLLM 多 Agent 应用实践:源码部署与 Web 调试指南
  • GitHub Copilot 学生认证流程与 Python 自动化实现
  • 基于 SpringBoot 的网页时装购物系统设计与实现
  • 人工智能大模型部署与工程化落地实战
  • 无人机电机与电子调速器模块详解
  • Ubuntu 24.04 LTS 安装 OpenClaw 指南
  • 独立开发者如何利用 AIGC 解决 UI 素材短缺问题
  • 十分钟实战:使用 Resend 构建邮件营销系统
  • 动态规划:删除并获得点数
  • 2025 主流 AI 工具推荐:聊天、搜索、编程与创作
  • macOS Web 模拟器开源项目技术解析与部署指南
  • 微软 Edge Webview2 v144 升级导致 SAP GUI 白屏故障及解决方案
  • 大疆 RTK 无人机免像控与有像控精度对比验证
  • 基于 LLaMA-Factory 的 LLM DPO 训练实战
  • Flutter 三方库 xpath_selector 在鸿蒙系统的适配与应用
  • 大语言模型中的 Token 与上下文窗口解析
  • 从手动标注到智能打标:AI 数据标注工具实战解析
  • 零基础转行 Python 核心知识体系与学习路径
  • 昇腾设备部署 llama.cpp 实践
  • Linux 信号保存核心:未决信号集与阻塞信号集详解

相关免费在线工具

  • 加密/解密文本

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