
链表是 C 语言数据结构学习中的核心考点,也是指针操作最经典的练兵场。下面我们通过三个高频题型——删除指定值节点、反转链表、查找中间节点,从算法原理到代码实现逐一拆解,帮你吃透链表操作的核心逻辑。
一、删除链表中等于给定值 val 的所有节点
题目描述
给定一个链表的头节点 head 和一个整数 val,请删除链表中所有值等于 val 的节点,并返回新的头节点。
参考链接:LeetCode 203. 移除链表元素

算法思路
这道题最直接的做法是构建一个新链表。遍历原链表时,只将不等于 val 的节点尾插到新链表中。这样既保留了原有顺序,又避开了直接修改原链表指针可能带来的断链风险。
关键点在于维护新链表的头指针和尾指针。如果新链表为空,头尾指针同时指向当前节点;否则,将当前节点接到尾指针后面,并更新尾指针。最后记得将新尾节点的 next 置为 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;
}
(newtail) {
newtail->next = ;
}
newhead;
}






