云计算百科
云计算领域专业知识百科平台

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

在这里插入图片描述

🔥小龙报:个人主页 🎬作者简介:C++研发,嵌入式,机器人等方向学习者 ❄️个人专栏:《C语言》《【初阶】数据结构与算法》 ✨ 永远相信美好的事情即将发生

在这里插入图片描述

文章目录

  • 前言
  • 一、删除链表中等于给定值 val 的所有节点
    • 1.1题目
    • 1.2 算法原理
    • 1.3代码
  • 二、反转链表
    • 2.1题目
    • 2.2 算法原理
    • 2.3代码
  • 三、链表中间节点
    • 3.1题目
    • 3.2 算法原理
    • 3.3代码
  • 总结与每日励志

前言

链表是 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;

}

总结与每日励志

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

赞(0)
未经允许不得转载:网硕互联帮助中心 » 【C语言进阶数据结构与算法】单链表综合练习:1.删除链表中等于给定值 val 的所有节点 2.反转链表 3.链表中间节点
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!