前言
链表是 C 语言数据结构学习的核心考点,也是编程入门绕不开的经典题型。本文聚焦删除指定值节点、反转链表、查找中间节点三大高频链表题,从算法原理到代码实现逐拆解,用通俗易懂的逻辑和清晰的代码示例,帮你吃透链表操作的核心思路。掌握这些基础题型,不仅能夯实指针功底,更能为后续复杂数据结构学习筑牢根基。
一、删除链表中等于给定值 val 的所有节点
题目
给定一个链表的头节点 head 和一个整数 val,请你删除链表中所有满足 node.val == val 的节点,并返回新的头节点。
算法原理
处理链表删除时,直接修改原链表往往需要特殊处理头节点的情况(比如头节点就是要删的值)。这里采用一种更稳健的思路:创建一个新链表,遍历原链表,把不等于 val 的节点依次尾插到新链表中。这样逻辑统一,不需要单独判断头节点是否被删除。
代码实现
/**
* 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;
}
二、反转链表
题目
给你单链表的头节点 head,请你反转链表,并返回反转后的链表。
算法原理
反转链表的核心在于改变节点的 next 指向。最直观的方法是使用三个指针:prev(前驱)、(当前)、(后继)。


