讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现单向链表_C++手写链表增删改查底层代码【手撕】

老静同学_3053

老静同学_3053

发布时间:2026-02-05 15:01:02

|

204人浏览过

|

来源于php中文网

原创

因面试算法题需暴露指针细节,std::list封装过深;手写可掌握内存布局、空链表处理、nullptr检查及悬垂指针防范等核心要点。

c++如何实现单向链表_c++手写链表增删改查底层代码【手撕】

为什么不能直接用 std::list 而要手写单向链表

因为面试、笔试、算法课作业或嵌入式环境里,常要求你暴露指针操作细节,std::list 封装太深,无法体现内存布局和节点管理逻辑。手写能看清:节点怎么分配、头指针怎么维护、空链表边界怎么处理。

常见错误是忽略 nullptr 判定,比如在空链表上调用 deleteHead() 却没检查 head == nullptr,直接解引用导致段错误。

  • 所有插入/删除前,先判断 head 是否为空
  • 删除节点后必须将原指针置为 nullptr(尤其在析构或清空时)
  • 不要在遍历中释放当前节点后还访问 current->next —— 应该先保存 next = current->next,再 delete current

Node 结构体和 LinkedList 类的基本骨架

单向链表只需一个 next 指针,Node 通常定义为内部结构体;LinkedList 管理 head,不存 size 是常见简化做法(加 size 成员可避免每次查长度都遍历)。

struct Node {
    int val;
    Node* next;
    Node(int x) : val(x), next(nullptr) {}
};
<p>class LinkedList {
private:
Node* head;
public:
LinkedList() : head(nullptr) {}
~LinkedList() { clear(); }
void clear();
// 其他接口...
};

注意:Node 构造函数显式初始化 next 为 nullptr,否则野指针风险极高;LinkedList 析构调用 clear(),避免资源泄漏。

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

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

插入操作:头插、尾插、按索引插的差异点

头插最简单,时间复杂度 O(1);尾插需遍历到末尾,O(n),除非额外维护 tail 指针;按索引插入必须处理越界(索引 length)。

  • 头插:newNode->next = head; head = newNode;
  • 尾插:特判空链表(head == nullptr),否则循环到 cur->next == nullptr 再接上
  • 按索引插:先用辅助函数 getNodeAt(int index) 获取前驱节点(不是目标节点!),对 index=0 要特殊处理为头插

容易踩坑的是:插入时忘记更新前驱的 next,或者把新节点插到了错误位置(比如本该插在第 i 个位置,却插在了第 i+1 个)。

删除与查找:如何安全释放节点并避免悬垂指针

删除节点本质是「跳过它」:让前驱的 next 指向被删节点的 next,再 delete 它。关键在于拿到前驱 —— 查找时必须多走一步,或用双指针法。

  • 删头节点:Node* tmp = head; head = head->next; delete tmp;,别忘了 tmp = nullptr(虽非必须,但习惯好)
  • 删指定值:遍历时用 prev 和 curr,找到后 prev->next = curr->next,再 delete curr
  • 按索引删:同样依赖前驱,index=0 单独处理;index 越界直接 return

查找函数返回 Node* 本身不危险,但调用方若保存了该指针,在后续删除操作后继续使用,就是典型悬垂指针 —— 手写链表里,这类 bug 很难被编译器捕获,只能靠逻辑严谨性预防。

真正麻烦的是多线程环境下的 delete —— 但手撕题一般不考,先确保单线程下每个 new 都有唯一对应的 delete,且无重复释放。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

更多
golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

4294

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

4431

2025.07.04

string转int
string转int

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

5679

2023.08.02

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

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

2825

2024.08.29

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

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

3548

2025.08.29

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

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

2525

2025.08.29

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

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

319

2026.04.23

length函数用法
length函数用法

length函数用于返回指定字符串的字符数或字节数。可以用于计算字符串的长度,以便在查询和处理字符串数据时进行操作和判断。 需要注意的是length函数计算的是字符串的字符数,而不是字节数。对于多字节字符集,一个字符可能由多个字节组成。因此,length函数在计算字符串长度时会将多字节字符作为一个字符来计算。更多关于length函数的用法,大家可以阅读本专题下面的文章。

1747

2023.09.19

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

80

2026.09.30

热门下载

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

精品课程

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

共0课时 | 0人学习

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

共102课时 | 10.7万人学习

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

共162课时 | 28.2万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn