0

0

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

冰火之心

冰火之心

发布时间:2026-01-20 12:15:30

|

871人浏览过

|

来源于php中文网

原创

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

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

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

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

实操建议:

Lessie AI
Lessie AI

一款定位为「People Search AI Agent」的AI搜索智能体

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

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

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

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

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

实操建议:

  • 头插:先设 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 分支;但尾插必须区分空链表(此时等价于头插)和非空链表(需遍历),这个分支躲不开,也别硬凑成一种写法

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

751

2023.08.22

string转int
string转int

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

318

2023.08.02

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

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

538

2024.08.29

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

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

53

2025.08.29

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

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

197

2025.08.29

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

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

1025

2023.10.19

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

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

66

2025.10.17

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

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

452

2025.12.29

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

3

2026.01.20

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
HTML5/CSS3/JavaScript/ES6入门课程
HTML5/CSS3/JavaScript/ES6入门课程

共102课时 | 6.8万人学习

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

共162课时 | 18.9万人学习

第二十二期_前端开发
第二十二期_前端开发

共119课时 | 12.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

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