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

基本数据结构:链表

 

谈到链表之前,先说一下线性表。线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表有两种存储方式,一种是顺序存储结构,另一种是链式存储结构。

顺序存储结构就是两个相邻的元素在内存中也是相邻的。这种存储方式的优点是查询的时间复杂度为O(1),通过首地址和偏移量就可以直接访问到某元素,关于查找的适配算法很多,最快可以达到O(logn)。缺点是插入和删除的时间复杂度最坏能达到O(n),如果你在第一个位置插入一个元素,你需要把数组的每一个元素向后移动一位,如果你在第一个位置删除一个元素,你需要把数组的每一个元素向前移动一位。还有一个缺点,就是当你不确定元素的数量时,你开的数组必须保证能够放下元素最大数量,遗憾的是如果实际数量比最大数量少很多时,你开的数组没有用到的内存就只能浪费掉了。

我们常用的数组就是一种典型的顺序存储结构,如图1。

链式存储结构就是两个相邻的元素在内存中可能不是相邻的,每一个元素都有一个指针域,指针域一般是存储着到下一个元素的指针。这种存储方式的优点是插入和删除的时间复杂度为O(1),不会浪费太多内存,添加元素的时候才会申请内存,删除元素会释放内存,。缺点是访问的时间复杂度最坏为O(n),关于查找的算法很少,一般只能遍历,这样时间复杂度也是线性(O(n))的了,频繁的申请和释放内存也会消耗时间。

顺序表的特性是随机读取,也就是访问一个元素的时间复杂度是O(1),链式表的特性是插入和删除的时间复杂度为O(1)。要根据实际情况去选取适合自己的存储结构。

链表就是链式存储的线性表。根据指针域的不同,链表分为单向链表、双向链表、循环链表等等。

一、 单向链表(slist)

链表中最简单的一种是单向链表,每个元素包含两个域,值域和指针域,我们把这样的元素称之为节点。每个节点的指针域内有一个指针,指向下一个节点,而最后一个节点则指向一个空值。如图2就是一个单向链表。

一个单向链表的节点被分成两个部分。第一个部分保存或者显示关于节点的信息,第二个部分存储下一个节点的地址。单向链表只可向一个方向遍历。

我写了一个简单的C++版单向链表类模板,就用这段代码讲解一下一个具体的单向链表该怎么写(代码仅供学习),当然首先你要具备C++基础知识和简单的模板元编程。
完整代码

首先我们要写一个节点类,链表中的每一个节点就是一个节点类的对象。如图3。

转载于:https://www.cnblogs.com/gaoyuechen/p/7351883.html

相关文章:

  • LinuxMint17.3配置全局变量
  • Android零基础入门第33节:Android事件处理概述
  • app开发版面设计原则
  • matplotlib 雷达图2
  • 省赛选拔赛解题报告
  • ID、句柄、指针、对象互相转换
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • sql 查出一张表中重复的所有记录数据
  • Spinner使用二
  • 用jquery写循环播放div的相关笔记 珍贵的总结 -1
  • 【Python】raw转义字符
  • 【OpenStack】OpenStack系列4之Glance详解
  • 事件委托的小应用
  • WP_Query的使用方法
  • docker容器互联 分离部署PHP 和 nginx(端口映射方式)
  • [case10]使用RSQL实现端到端的动态查询
  • axios 和 cookie 的那些事
  • C++类的相互关联
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • css的样式优先级
  • egg(89)--egg之redis的发布和订阅
  • HTTP中GET与POST的区别 99%的错误认识
  • iOS编译提示和导航提示
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Unix命令
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 创建一个Struts2项目maven 方式
  • 少走弯路,给Java 1~5 年程序员的建议
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 小而合理的前端理论:rscss和rsjs
  • 用element的upload组件实现多图片上传和压缩
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • Spring Batch JSON 支持
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (Python) SOAP Web Service (HTTP POST)
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (七)理解angular中的module和injector,即依赖注入
  • (转)创业的注意事项
  • (转载)Linux网络编程入门
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET4.0并行计算技术基础(1)
  • .NET序列化 serializable,反序列化
  • .project文件
  • .py文件应该怎样打开?
  • [BZOJ] 1001: [BeiJing2006]狼抓兔子
  • [C++] Windows中字符串函数的种类
  • [HOW TO]如何在iPhone应用程序中发送邮件
  • [IDF]摩斯密码
  • [JavaWeb学习] tomcat简介、安装及项目部署
  • [LeetCode]Balanced Binary Tree
  • [LeetCode系列]子集枚举问题[无重复元素]
  • [Lucene] Lucene 全文检索引擎简介