插入链表前须校验头指针有效性,空链表需单独处理;头插时间复杂度O(1)但逆序,须返回新head;指定位置插入需定位前驱节点;注意断链、内存泄漏与野指针风险,强调边界检查与资源管理。

插入节点前必须确保头指针有效
如果 head 是空指针(nullptr),直接对 head->next 解引用会崩溃。插入前必须单独处理空链表情况,否则触发段错误。
- 插入到空链表:新节点成为唯一节点,
head应直接指向它 - 插入到非空链表:需遍历或定位,再修改指针
- 所有插入操作都应返回更新后的
head(尤其在头插时),避免调用方仍持有旧地址
头插法最简单但会改变原有顺序
头插即把新节点插入到链表最前端,时间复杂度 O(1),但会使插入顺序与遍历顺序相反。适用于不关心输入顺序、仅需快速堆叠的场景(如函数调用栈模拟)。
Node* insertAtHead(Node* head, int val) {
Node* newNode = new Node(val);
newNode->next = head;
return newNode; // 必须返回新 head
}在指定位置插入需先找到前驱节点
比如在第 pos 个位置(从 0 开始)插入,实际要找到第 pos-1 个节点(前驱)。若 pos == 0,等价于头插;若 pos 超出长度,通常插入到末尾或报错——需明确定义行为。
- 遍历时用
current != nullptr && index 判断,避免访问nullptr->next - 插入后不要漏掉
newNode->next = current->next,否则断链 - 若用单向链表实现“在节点后插入”,则传入的是目标节点指针,无需遍历
内存泄漏和野指针风险常被忽略
每次 new Node 后,若插入中途抛异常(如内存不足)、或忘记更新指针,就可能丢失节点地址。生产环境建议用智能指针,但裸指针实现中必须保证:
立即学习“C++免费学习笔记(深入)”;
- 分配成功后再修改链表结构
- 失败时及时
delete newNode - 删除节点后立即将其指针置为
nullptr(尤其调试阶段)
真正麻烦的不是写插入逻辑,而是边界校验和资源归属——比如谁负责释放原链表内存、插入失败时状态是否可回滚。









