当前位置: 首页 > news >正文

c++ 链表详细介绍

链表是数据结构的一种,由节点组成,每个节点包含数据和指向下一个节点的指针。链表在C++中的实现可以是单链表、双链表或循环链表。以下是链表的详细介绍:

1. 单链表

结构

  • 节点(Node):每个节点包含数据和一个指针(next),指向链表中的下一个节点。

示例结构

struct Node {int data;Node* next;Node(int d) : data(d), next(nullptr) {}
};

操作

  • 插入:在链表头部、尾部或中间插入新节点。
  • 删除:从链表中删除指定节点。
  • 遍历:从头到尾访问链表中的每个节点。
  • 查找:在链表中查找指定值的节点。

2. 双链表

结构

  • 节点(Node):每个节点包含数据、一个指针(next)指向下一个节点,和一个指针(prev)指向前一个节点。

示例结构

struct Node {int data;Node* next;Node* prev;Node(int d) : data(d), next(nullptr), prev(nullptr) {}
};

操作

  • 插入:可以在任意位置插入新节点,同时更新前驱和后继指针。
  • 删除:从链表中删除指定节点,并调整前驱和后继指针。
  • 遍历:可以从头到尾或从尾到头访问节点。

3. 循环链表

单循环链表

  • 结构:链表的最后一个节点指向头节点,形成一个循环。

双循环链表

  • 结构:结合了双链表和循环链表的特点,最后一个节点指向头节点,头节点的前驱指向最后一个节点。

操作

  • 插入和删除:类似于单链表和双链表,但需要注意循环结构的维护。
  • 遍历:遍历链表时需要避免无限循环。

优缺点

优点

  • 动态大小:链表的大小可以在运行时调整。
  • 插入和删除:在已知节点的情况下,插入和删除操作比数组更高效。

缺点

  • 额外内存:每个节点需要额外的指针存储。
  • 访问速度:访问链表的元素通常比数组慢,因为需要从头部开始逐个遍历。

示例代码(单链表基本操作)

插入节点

void insertAtHead(Node*& head, int data) {Node* newNode = new Node(data);newNode->next = head;head = newNode;
}

删除节点

void deleteNode(Node*& head, int key) {Node* temp = head;Node* prev = nullptr;if (temp != nullptr && temp->data == key) {head = temp->next;delete temp;return;}while (temp != nullptr && temp->data != key) {prev = temp;temp = temp->next;}if (temp == nullptr) return;prev->next = temp->next;delete temp;
}

遍历链表

void printList(Node* head) {Node* temp = head;while (temp != nullptr) {std::cout << temp->data << " ";temp = temp->next;}std::cout << std::endl;
}

链表是一种灵活的动态数据结构,适用于需要频繁插入和删除操作的场景。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++vector类 (带你一篇文章搞定C++中的vector类)
  • 区块链审计 如何测试solidity的bool值占用几个字节
  • 基于SpringBoot+Vue+MySQL的画师约稿平台系统
  • 【Unity-Lua】音乐播放器循环滚动播放音乐名
  • 【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】
  • 【Kubernetes】常见面试题汇总(二)
  • JVM: JDK内置命令 - JPS
  • 微信小程序-formData使用
  • 【MySQL】查询表中重复数据、模糊查询列信息、快速copy表数据(1)
  • 分布式锁-Redisson 可重入锁
  • 注意力机制的细节
  • redis群集的三种模式
  • Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号
  • crm如何做私域运营?
  • Harmony Next 文件命令操作(发送、读取、媒体文件查询)
  • JS 中的深拷贝与浅拷贝
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • Computed property XXX was assigned to but it has no setter
  • css属性的继承、初识值、计算值、当前值、应用值
  • flutter的key在widget list的作用以及必要性
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • Linux后台研发超实用命令总结
  • MYSQL 的 IF 函数
  • socket.io+express实现聊天室的思考(三)
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 和 || 运算
  • 悄悄地说一个bug
  • 听说你叫Java(二)–Servlet请求
  • 我看到的前端
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​业务双活的数据切换思路设计(下)
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #QT(串口助手-界面)
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (二)斐波那契Fabonacci函数
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (过滤器)Filter和(监听器)listener
  • (精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)python发送HTTP 请求的两种方式(get和post )
  • .NET CORE Aws S3 使用
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .Net多线程总结
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET下的多线程编程—1-线程机制概述
  • .NET中 MVC 工厂模式浅析
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .Net中间语言BeforeFieldInit
  • .Net转前端开发-启航篇,如何定制博客园主题
  • .py文件应该怎样打开?
  • @ModelAttribute注解使用
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬