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

1.2 思路解析
这道题最直观的做法是遍历原链表,将不等于 val 的节点依次尾插到新链表中。虽然空间复杂度略高(需要额外 O(N) 空间),但逻辑简单且不易出错。关键在于维护好新链表的头指针和尾指针,确保每次插入后尾指针能正确更新,最后记得将新尾节点的 next 置为 NULL,防止形成环。
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 = ;
newhead;
}




