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

数据结构~链表

返回目录

概况

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,链表比较方便插入和删除操作。

链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表:顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。在计算机科学中,链表作为一种基础的数据结构可以用来生成其它类型的数据结构。链表通常由一连串节点组成,每个节点包含任意的实例数据(data fields)和一或两个用来指向明上一个/或下一个节点的位置的链接("links")。链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。而链表是一种自我指示数据类型,因为它包含指向另一个相同类型的数据的指针(链接)。链表允许插入和移除表上任意位置上的节点,[1]但是不允许随机存取。链表有很多种不同的类型:单向链表,双向链表以及循环链表。链表可以在多种编程语言中实现。像Lisp和Scheme这样的语言的内建数据类型中就包含了链表的存取和操作。程序语言或面向对象语言,如C,C++和Java依靠易变工具来生成链表。

图像

特点

线性表的链式存储表示的特点是用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。因此,为了表示每个数据元素 与其直接后继数据元素 之间的逻辑关系,对数据元素 来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。由这两部分信息组成一个"结点"(如概述旁的图所示),表示线性表中一个数据元素 。

扩展

根据情况,也可以自己设计链表的其它扩展。但是一般不会在边上附加数据,因为链表的点和边基本上是一一对应的(除了第一个或者最后一个节点,但是也不会产生特殊情况)。不过有一个特例是如果链表支持在链表的一段中把前和后指针反向,反向标记加在边上可能会更方便。

对于非线性的链表,可以参见相关的其他数据结构,例如树、图。另外有一种基于多个线性链表的数据结构:跳表,插入、删除和查找等基本操作的速度可以达到O(nlogn),和平衡二叉树一样。

其中存储数据元素信息的域称作数据域(设域名为data),存储直接后继存储位置的域称为指针域(设域名为next)。指针域中存储的信息又称做指针或链。

由分别表示,,…, 的N 个结点依次相链构成的链表,称为线性表的链式存储表示,由于此类链表的每个结点中只包含一个指针域,故又称单链表或线性链表。

两种链表形式

一、循环链表

循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。

循环链表的运算与单链表的运算基本一致。所不同的有以下几点:

1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。

2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL。

二、双向链表

双向链表其实是单链表的改进。

当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表

在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。

返回目录

转载于:https://www.cnblogs.com/lori/archive/2011/08/03/2125964.html

相关文章:

  • ComboBox控件数据绑定
  • [转].NET 数字格式化:忽略末尾零
  • 根据年份-月份,获得此月份的所有日期
  • [MSSQL]GROUPING SETS,ROLLUP,CUBE初体验
  • Android系统特质 不需要太多剩余内存
  • 转:SQLServer2000 数据库事务日志备份
  • Android ADB命令的使用
  • 嵌入式中linu+android与wince的区别
  • Struts2与Struts1的对比
  • memcache 管理指令 --stats
  • ListView(二)
  • Flex--水晶按钮
  • Links to sample code for the Windows Phone 7
  • [30期] 我的学习方法
  • 莫名的PAMIE错误
  • 网络传输文件的问题
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • CSS实用技巧
  • gops —— Go 程序诊断分析工具
  • Javascript Math对象和Date对象常用方法详解
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • MySQL主从复制读写分离及奇怪的问题
  • Nodejs和JavaWeb协助开发
  • npx命令介绍
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • thinkphp5.1 easywechat4 微信第三方开放平台
  • underscore源码剖析之整体架构
  • 解析 Webpack中import、require、按需加载的执行过程
  • 聚簇索引和非聚簇索引
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 前端性能优化——回流与重绘
  • 让你的分享飞起来——极光推出社会化分享组件
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 以太坊客户端Geth命令参数详解
  • 用Visual Studio开发以太坊智能合约
  • 最简单的无缝轮播
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #stm32驱动外设模块总结w5500模块
  • (07)Hive——窗口函数详解
  • (分享)自己整理的一些简单awk实用语句
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (力扣记录)235. 二叉搜索树的最近公共祖先
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (四)linux文件内容查看
  • (算法)求1到1亿间的质数或素数
  • (小白学Java)Java简介和基本配置
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)visual stdio 书签功能介绍
  • .bat批处理(一):@echo off
  • .htaccess 强制https 单独排除某个目录
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复