全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何用c++实现一个链表 单链表的创建、插入和删除【数据结构】

C++单链表需定义节点结构和链表类,手动管理内存;核心操作包括头插(O(1))、指定位置插入(需遍历)、按值删除(分头/中/尾处理),并需实现析构函数防止内存泄漏。

用 C++ 实现单链表,核心是定义节点结构、管理头指针,并封装插入、删除等操作。不需要依赖 STL 容器,手动管理内存更利于理解数据结构本质。

定义节点结构和链表类

每个节点包含数据域和指向下一节点的指针;链表类维护头指针(可为 nullptr 表示空表):

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};

class LinkedList { private: ListNode* head; public: LinkedList() : head(nullptr) {} ~LinkedList(); // 后续需实现析构释放内存 };

在链表头部插入节点(最简单)

时间复杂度 O(1),适合频繁在开头增删的场景:

  • 新建节点,赋值
  • 新节点 next 指向原 head
  • 更新 head 指向新节点
void insertAtHead(int value) {
    ListNode* newNode = new ListNode(value);
    newNode->next = head;
    head = newNode;
}

在指定位置插入(如第 i 个位置,从 0 开始)

需遍历到前一个节点,注意边界检查(i 小于 0 或超过长度时可忽略或报错):

  • i == 0 等价于头插,直接调用 insertAtHead
  • 遍历至第 i−1 个节点(prev),若 prev 为 nullptr 说明越界
  • 新建节点,接在 prev 后面:newNode→next = prev→next;prev→next = newNode
void insertAt(int index, int value) {
    if (index == 0) {
        insertAtHead(value);
        return;
    }
    ListNode* prev = head;
    for (int i = 0; i < index - 1 && prev != nullptr; ++i) {
        prev = prev->next;
    }
    if (prev == nullptr) return; // 位置无效
    ListNode* newNode = new ListNode(value);
    newNode->next = prev->next;
    prev->next = newNode;
}

删除节点(按值或按位置)

以按值删除为例(删第一个匹配的节点),需处理三种情况:

  • 空链表 → 直接返回
  • 头节点即目标 → 更新 head,并 delete 原头节点
  • 中间或尾部节点 → 找到前驱 prev,跳过目标节点,并释放内存
void deleteByValue(int value) {
    if (!head) return;
    if (head->val == value) {
        ListNode* temp = head;
        head = head->next;
        delete temp;
        return;
    }
    ListNode* prev = head;
    while (prev->next && prev->next->val != value) {
        prev = prev->next;
    }
    if (prev->next) {
        ListNode* toDelete = prev->next;
        prev->next = toDelete->next;
        delete toDelete;
    }
}

补充:遍历与析构(避免内存泄漏)

打印链表用于调试:

void print() {
    ListNode* cur = head;
    while (cur) {
        std::cout << cur->val;
        if (cur->next) std::cout << " → ";
        cur = cur->next;
    }
    std::cout << std::endl;
}

析构函数应逐个释放节点:

LinkedList::~LinkedList() {
    while (head) {
        ListNode* temp = head;
        head = head->next;
        delete temp;
    }
}

不复杂但容易忽略


# node  # c++  # 封装  # 析构函数  # 指针  # 数据结构  # delete  # 链表  # 遍历  # 第一个  # 不需要  # 下一  # 三种  # 为例  # 报错  # 最简单 


相关文章: 定制建站模板如何实现SEO优化与智能系统配置?18字教程  如何撰写建站申请书?关键要点有哪些?  建站之家VIP精选网站模板与SEO优化教程整合指南  济南企业网站制作公司,济南社保单位网上缴费步骤?  如何快速使用云服务器搭建个人网站?  网站制作员失业,怎样查看自己网站的注册者?  如何快速搭建虚拟主机网站?新手必看指南  建站主机选哪种环境更利于SEO优化?  网站专业制作公司有哪些,做一个公司网站要多少钱?  招贴海报怎么做,什么是海报招贴?  宁波自助建站系统如何快速打造专业企业网站?  高防服务器如何保障网站安全无虞?  ,柠檬视频怎样兑换vip?  建站之星北京办公室:智能建站系统与小程序生成方案解析  如何快速生成可下载的建站源码工具?  高端企业智能建站程序:SEO优化与响应式模板定制开发  Python多线程使用规范_线程安全解析【教程】  如何通过免费商城建站系统源码自定义网站主题与功能?  表情包在线制作网站免费,表情包怎么弄?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  如何快速搭建安全的FTP站点?  javascript基本数据类型及类型检测常用方法小结  ,制作一个手机app网站要多少钱?  太原网站制作公司有哪些,网约车营运证查询官网?  如何零基础在云服务器搭建WordPress站点?  ,有什么在线背英语单词效率比较高的网站?  制作网站的软件免费下载,免费制作app哪个平台好?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  如何在橙子建站上传落地页?操作指南详解  官网网站制作腾讯审核要多久,联想路由器newifi官网  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  制作证书网站有哪些,全国城建培训中心证书查询官网?  Swift中循环语句中的转移语句 break 和 continue  建站之星24小时客服电话如何获取?  C++如何使用std::optional?(处理可选值)  建站之星代理如何优化在线客服效率?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  制作营销网站公司,淘特是干什么用的?  文字头像制作网站推荐软件,醒图能自动配文字吗?  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何高效完成独享虚拟主机建站?  如何在橙子建站中快速调整背景颜色?  如何通过主机屋免费建站教程十分钟搭建网站?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  盐城做公司网站,江苏电子版退休证办理流程?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  建站之星安装失败:服务器环境不兼容?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。