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

链表常见操作:移除元素、合并、反转及回文判断

详细讲解了链表的核心算法操作,涵盖移除指定值节点、合并两个有序链表等基础内容。文章采用双指针等经典策略,提供清晰的解题思路与 C 语言代码实现,旨在帮助开发者巩固数据结构基础并提升算法解题能力。

静心发布于 2026/3/24更新于 2026/7/205.7K 浏览
链表常见操作:移除元素、合并、反转及回文判断

示意图

一、移除链表元素

题目链接:https://leetcode.cn/problems/remove-linked-list-elements/

题目描述与示例:

示意图

根据题目描述,我们需要删除链表中值为指定值的节点,并返回新链表的头结点。

思路一

使用之前实现的链表方法,通过 Find 方法找到对应值,然后使用 Erase 方法删除,直到 Find 方法返回空指针结束。该方法实现简单,但效率较低。

思路二

本质与顺序表删除类似,使用双指针法。新建一个链表,遍历原链表,将非目标值的节点尾插到新链表。注意处理新链表头为空的情况,并在遍历结束后将新链表尾结点的 next 置为 NULL。

参考实现:

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

示意图

二、合并两个有序链表

题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/

题目描述与示例:

示意图

给定两个有序链表,要求合并成一个新的有序链表并返回头结点。

思路

类似于合并有序数组,使用双指针遍历两个链表,比较节点大小,将较小的节点尾插到新链表。当其中一个链表遍历结束时,将另一个链表的剩余节点直接连接到新链表尾部。需特殊处理空链表情况。

参考实现:

typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    if (list1 == NULL) return list2;
    if (list2 == NULL) return list1;
    
    ListNode* pcur1 = list1;
    ListNode* pcur2 = list2;
    ListNode* newhead = NULL;
    ListNode* newtail = NULL;
    
    while (pcur1 && pcur2) {
        if (pcur1->val < pcur2->val) {
            if (newhead == NULL) {
                newhead = newtail = pcur1;
            } else {
                newtail->next = pcur1;
                newtail = pcur1;
            }
            pcur1 = pcur1->next;
        } else {
            if (newhead == NULL) {
                newhead = newtail = pcur2;
            } else {
                newtail->next = pcur2;
                newtail = pcur2;
            }
            pcur2 = pcur2->next;
        }
    }
    
    if (pcur1) newtail->next = pcur1;
    if (pcur2) newtail->next = pcur2;
    
    return newhead;
}

目录

  1. 一、移除链表元素
  2. 思路一
  3. 思路二
  4. 二、合并两个有序链表
  5. 思路
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • C++ 继承:面向对象代码复用的核心机制
  • ROS2+Gazebo+PX4 仿真环境搭建与无人机起飞指南
  • 基于 Python 与 AI 的每日新闻简报应用实战
  • Python Flask 实战:将本地学生成绩系统升级为在线 Web 应用
  • GitHub 核心功能与操作指南
  • Spring Boot 游戏开发实战:实现游戏同步、结果页面与记录管理
  • Spring Boot 微服务架构设计与实战
  • Linux 父子进程机制解析:fork 函数原理与应用
  • VS Code 禁用 Copilot 代码自动补全
  • Gitea 安装配置及常用 Git 命令指南
  • Ubuntu 20.04 安装 Ollama 及 Open WebUI 部署大型语言模型
  • 二叉树递归遍历与剪枝算法详解
  • Python 全栈开发核心知识体系与实战进阶指南
  • Llama 开源家族演进:从 Llama-1 到 Llama-3 深度解析
  • 弱智吧数据助力中文大模型指令微调研究
  • Python 项目通用目录结构详解
  • 西门子 S7-1500 与 Fanuc 机器人焊装系统集成及 Profinet 通讯实践
  • 前端行业现状分析:是否属于夕阳行业?
  • OpenClaw 本地 AI 智能体入门与实战指南
  • Dify MCP Server 将工作流发布为第三方可调用服务

相关免费在线工具

  • 加密/解密文本

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