C++链表如何实现?C++手写单链表的创建与操作【数据结构】

8次阅读

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

C++ 链表如何实现?C++ 手写单链表的创建与操作【数据结构】

手写单链表是理解指针和动态内存管理的关键一步。核心在于定义节点结构、掌握头指针的维护逻辑,以及避免野指针和内存泄漏。

节点结构与头指针定义

单链表每个节点包含数据域和指向下一节点的指针。头指针不存数据,仅标识链表起始位置,初始值应为 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,造成崩溃

基本上就这些。写完多用小样例手动走一遍指针变化,比看十遍代码更管用。

text=ZqhQzanResources