c++中如何实现单链表的插入_c++单链表插入节点

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

插入节点前必须确保头指针有效

如果 head 是空指针(nullptr),直接对 head->next 解引用会崩溃。插入前必须单独处理空链表情况,否则触发段错误。

  • 插入到空链表:新节点成为唯一节点,head 应直接指向它
  • 插入到非空链表:需遍历或定位,再修改指针
  • 所有插入操作都应返回更新后的 head(尤其在头插时),避免调用方仍持有旧地址

头插法最简单但会改变原有顺序

头插即把新节点插入到链表最前端,时间复杂度 O(1),但会使插入顺序与遍历顺序相反。适用于不关心输入顺序、仅需快速堆叠的场景(如函数调用栈模拟)。

Node* ins

ertAtHead(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 后,若插入中途抛异常(如内存不足)、或忘记更新指针,就可能丢失节点地址。生产环境建议用智能指针,但裸指针实现中必须保证:

  • 分配成功后再修改链表结构
  • 失败时及时 delete newNode
  • 删除节点后立即将其指针置为 nullptr(尤其调试阶段)

真正麻烦的不是写插入逻辑,而是边界校验和资源归属——比如谁负责释放原链表内存、插入失败时状态是否可回滚。