【C语言进阶数据结构与算法】单链表综合练习:1.删除链表中等于给定值 val 的所有节点 2.反转链表 3.链表中间节点

🔥小龙报:个人主页

🎬作者简介:C++研发,嵌入式,机器人等方向学习者

❄️个人专栏:《C语言》《【初阶】数据结构与算法》
永远相信美好的事情即将发生

文章目录


前言

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

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

1.1题目

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

1.2 算法原理

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

1.3代码

csharp 复制代码
/**
 * 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代码

csharp 复制代码
/**
 * 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代码

csharp 复制代码
/**
 * 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;

}

总结与每日励志

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

相关推荐
hssfscv13 小时前
软件设计师下午题六——Java的各种设计模式
java·算法·设计模式
珂朵莉MM14 小时前
第七届全球校园人工智能算法精英大赛-算法巅峰赛产业命题赛第3赛季优化题--多策略混合算法
人工智能·算法
罗西的思考14 小时前
【OpenClaw】通过 Nanobot 源码学习架构---(6)Skills
人工智能·深度学习·算法
枫叶林FYL14 小时前
【自然语言处理 NLP】7.2 红队测试与对抗鲁棒性(Red Teaming & Adversarial Robustness)
人工智能·算法·机器学习
qiqsevenqiqiqiqi14 小时前
字符串模板
算法
十五年专注C++开发14 小时前
Oat++: 一个轻量级、高性能、零依赖的 C++ Web 框架
开发语言·c++·web服务·oatpp
陈天伟教授14 小时前
心电心音同步分析-案例:原型设计一
开发语言·人工智能·python·语言模型·架构
Ar-Sr-Na14 小时前
STM32现代化AI开发指南-VSCode环境配置(macOS)
c语言·人工智能·vscode·stm32·嵌入式硬件·硬件工程
Allen_LVyingbo14 小时前
量子计算Dirac Notation基本教学—从零基础到读懂量子信息论文(下)
开发语言·人工智能·python·数学建模·量子计算
Fcy64814 小时前
算法基础详解(六)倍增思想与离散化思想
算法·快速幂·离散化·倍增算法