手写单链表需定义节点结构(含数据域和next指针)并正确维护头指针(初始为nullptr);插入、删除、查找操作须注意指针顺序与边界检查;务必配对new/delete,避免野指针、内存泄漏和空指针解引用。

手写单链表是理解指针和动态内存管理的关键一步。核心在于定义节点结构、掌握头指针的维护逻辑,以及避免野指针和内存泄漏。
节点结构与头指针定义
单链表每个节点包含数据域和指向下一节点的指针。头指针不存数据,仅标识链表起始位置,初始值应为 nullptr。
示例定义:
struct ListNode {int val;
ListNode* next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
};
插入操作:头插、尾插、指定位置插
插入本质是修改指针指向,注意操作顺序,防止断链。
立即学习“C++免费学习笔记(深入)”;
- 头插:新节点 next 指向原头节点,再把头指针指向新节点(两步不可颠倒)
- 尾插:需遍历到末尾(cur->next == nullptr),再链接新节点
- 位置插入(如第 i 个位置):先找到第 i-1 个节点,再执行类似头插的两步操作;注意边界检查(i ≤ 0 或 i > 长度时无效)
删除与查找操作要点
删除必须保存待删节点的 next 指针,再释放该节点,否则后续节点丢失。
- 按值删除:遍历比较 val,找到后用临时指针保存待删节点,更新前驱的 next,再 delete
- 按位置删除:先定位前驱节点,同理操作;若删头节点,直接更新头指针
- 查找:从头开始遍历,返回节点指针或下标;未找到返回 nullptr 或 -1
内存管理与常见陷阱
每次 new 都要对应 delete,尤其在析构函数中必须遍历释放所有节点。
- 插入/删除后忘记更新指针,导致悬空或断链
- 释放节点后仍使用其指针(野指针)
- 头指针初始化为随机值而非 nullptr,引发未定义行为
- 遍历时未判断 cur == nullptr 就访问 cur->next,造成崩溃
基本上就这些。写完多用小样例手动走一遍指针变化,比看十遍代码更管用。










