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

算法思路
这里采用尾插法构建新链表。遍历原链表,将不等于 val 的节点依次连接到新链表的尾部。这样既能保留原有节点的顺序,又能高效完成过滤。需要注意的是,最后一定要将新链表的尾部指针置为 NULL,防止形成环。
代码实现
/**
* 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;
}






