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

思路解析
这题其实有个更直观的思路:既然要删掉特定值的节点,不如直接构建一个新链表,只把符合条件的节点'搬运'过去。这样逻辑简单,不容易出错。具体做法是遍历原链表,遇到不等于 val 的节点就尾插到新链表里,最后记得断开新链表的尾部指针。
虽然这种方法需要 O(N) 的额外空间,但胜在逻辑清晰,非常适合初学者理解链表操作的基本流程。
代码实现
/**
* 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;
}
(newtail) {
newtail->next = ;
}
newhead;
}






