1. 链表基础概念与核心操作
链表作为数据结构中的经典线性表实现方式,与数组有着本质区别。每个链表节点由数据域和指针域组成,通过指针串联实现动态存储。在C语言中,我们通常这样定义单链表节点:
c复制struct ListNode {
int val; // 数据域
struct ListNode *next; // 指针域
};
链表的优势在于动态内存分配,插入删除操作时间复杂度为O(1),但随机访问效率较低(O(n))。实际开发中,链表常用于实现文件系统、内存管理、浏览器历史记录等场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 链表删除操作全解析
2.1 基础节点删除
删除链表节点的核心在于正确调整指针指向。假设要删除节点B,其前驱节点为A,后继为C,操作逻辑应为:
c复制A->next = B->next; // 使A直接指向C
free(B); // 释放B的内存
典型错误包括:
- 未保存B->next导致内存泄漏
- 未检查空指针直接操作
- 忘记释放被删除节点内存
2.2 删除指定值节点实战
以下完整代码演示删除链表中所有值为target的节点:
c复制struct ListNode* removeElements(struct ListNode* head, int target) {
// 处理头节点特殊情况
while (head != NULL && head->val == target) {
struct ListNode* temp = head;
head = head->next;
free(temp);
}
// 处理中间节点
struct ListNode* current = head;
while (current != NULL && current->next != NULL) {
if (current->next->val == target) {
struct ListNode* temp = current->next;
current->
