链表操作是面试和实战中的高频考点,指针的灵活运用往往决定了代码的健壮性。下面通过三个经典题目,梳理单链表的核心处理逻辑。
一、删除链表中等于给定值 val 的所有节点
题目
参考 LeetCode 203. 移除链表元素。

思路
直接修改原链表指针比较麻烦,尤其是头结点可能需要被删除的情况。这里采用尾插法构建新链表会更直观:遍历原链表,将不等于 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;
}
二、反转链表
题目
参考 LeetCode 206. 反转链表。






