c++中如何实现单链表的节点插入_c++链表操作基础教程【实例】

雨明吖_1244

雨明吖_1244

2026-01-20

931人浏览

原创

插入节点前必须检查头指针是否为空,空链表头插可与非空链表统一处理为newnode->next = head; head = newnode;,但尾插必须区分空链表(等价头插)与非空链表(需遍历至末尾)。

c++中如何实现单链表的节点插入_c++链表操作基础教程【实例】

插入节点前必须先确认头指针是否为空

很多初学者在写 insert 时直接对 head->next 操作,结果一运行就 Segmentation fault。根本原因是没判断 head 是否为 nullptr,尤其在空链表中插入首个节点时,head 本身就是空的,不能解引用。

实操建议:

抖音下载器(Node.js)
抖音下载器(Node.js)

抖音无水印视频下载和文案提取工具

下载
  • 所有插入函数入口第一行加 if (head == nullptr) { head = newNode; return; }
  • 若采用带头结点(dummy node)方式,则头指针永远非空,但需注意:插入逻辑要从 dummy->next 开始,且最终返回的是 dummy->next,不是 dummy
  • 插入位置为第 0 位(即头插)时,无论链表是否为空,都应统一用 newNode->next = head; head = newNode;,比条件分支更简洁安全

头插、尾插、中间插的指针操作差异

三种插入方式看似只是位置不同,但指针修改顺序和依赖关系完全不同。错一步,就会丢节点或成环。

常见错误现象:插入后原链表“消失”、新节点没连上、next 指向随机地址(未初始化)。

实操建议:

  • 头插:先设 newNode->next = head;,再更新 head = newNode; —— 顺序不能反,否则会丢失原链表
  • 尾插:必须遍历到末尾(curr != nullptr && curr->next != nullptr),然后 curr->next = newNode;;别忘了 newNode->next = nullptr;,否则可能指向脏内存
  • 中间插(pos 索引):需找到第 pos-1 个节点(如插在索引 2 处,要停在索引 1 节点),再执行 newNode->next = prev->next; prev->next = newNode;

new 分配节点后必须检查是否分配成功

C++ 中 new 在内存不足时默认抛出 std::bad_alloc,但若用了 new(std::nothrow),则返回 nullptr。不检查就直接用,等于埋雷。

实操建议:

  • 基础写法:
    Node* newNode = new Node(val);
    if (newNode == nullptr) {
        throw std::runtime_error("Failed to allocate node");
    }
  • 更健壮的做法是封装为工厂函数:Node* makeNode(int val) { auto p = new Node(val); if (!p) throw std::bad_alloc{}; return p; }
  • 避免在循环插入中反复 new 后不处理异常,导致部分节点插入、部分失败,链表处于中间断裂状态

插入后忘记更新 size 或引发迭代器失效

如果链表类里维护了 size_ 成员,每次插入都必须 ++size_;否则 size() 返回值永远不准。另外,C++ 标准库没有链表迭代器失效规则可套用——自实现链表中,插入操作本身不使其他节点指针失效,但若用户缓存了某节点指针并期望它“始终有效”,要注意:该指针仍有效,但其逻辑位置可能已变(比如头插后,原来第一个节点变成第二个)。

实操建议:

  • 所有插入路径(头/尾/中间/空表)都要覆盖 ++size_,包括构造首个节点时
  • 若提供 begin()/end() 迭代器接口,插入不改变已有节点地址,所以不触发迭代器失效;但不要假设“插入后某个迭代器仍指向‘当前第 n 个’元素”,因为链表结构已变
  • 调试时可在插入前后打印 size_ 和遍历输出,快速验证是否漏更新或逻辑错位

实际写插入函数时,最容易被忽略的是:空链表头插与非空链表头插,代码可以完全一致,不需要 if 分支;但尾插必须区分空链表(此时等价于头插)和非空链表(需遍历),这个分支躲不开,也别硬凑成一种写法

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

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

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

下载

相关标签:

node c++ 标准库

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

5019

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

2585

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

3128

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

2185

10

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

2026.04.23

299

31

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3028

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

4169

12

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2025.12.29

3649

9

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

2026.01.19

346

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebSocket手册
WebSocket手册

共0课时 | 0人学习

HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 10.5万人学习

前端基础到实战(HTML5+CSS3+ES6+NPM)
前端基础到实战(HTML5+CSS3+ES6+NPM)

共162课时 | 27.6万人学习