单链表核心操作实战
链表是 C 语言指针操作的经典场景,也是数据结构面试中的高频考点。掌握链表的增删改查,尤其是涉及指针指向变更的逻辑,对理解内存管理至关重要。下面我们通过三个典型题目,拆解链表操作的核心思路。
一、删除链表中等于给定值 val 的所有节点
思路解析
这道题的关键在于如何处理头结点可能也需要被删除的情况。如果直接遍历原链表修改 next 指针,需要额外处理 head 为空或 head 本身即为目标值的情况。
这里采用一种更稳健的方法:构建一个新链表。遍历原链表,将不等于 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;
}
// 重要:断开新链表尾部,避免野指针
if (newtail) newtail->next = NULL;
return newhead;
}
二、反转链表
思路解析
反转链表是考察指针操作熟练度的经典题。核心思想是改变每个节点的 next 指向,使其指向前一个节点。为了在断链的同时不丢失后续节点,我们需要三个指针:




