首页 > 后端开发 > C++ > 正文

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

尼克
发布: 2025-12-19 02:03:08
原创
371人浏览过
C++单链表需定义节点结构和链表类,手动管理内存;核心操作包括头插(O(1))、指定位置插入(需遍历)、按值删除(分头/中/尾处理),并需实现析构函数防止内存泄漏。

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

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

定义节点结构和链表类

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

struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(nullptr) {}
};
<p>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 或超过长度时可忽略或报错):

立即学习C++免费学习笔记(深入)”;

  • 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;
    }
}
登录后复制

不复杂但容易忽略

以上就是如何用c++++实现一个链表 单链表的创建、插入和删除【数据结构】的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号