数据结构:线性表

来源:互联网 发布:神盾局特工 it是什么 编辑:程序博客网 时间:2024/06/08 12:53

数据结构:线性表

Eclipse java 工程: 单链接、双链表
demo: http://download.csdn.net/detail/keen_zuxwang/9875224

线性表是一种线性结构,是由零个或多个数据元素构成的有限序列。
线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一个直接前驱,有且只有一个直接后继,而序列头元素没有直接前驱,序列尾元素没有直接后继。
数组和链表都是在堆里分配内存

数据结构中常见的线性结构有:
数组、单链表、双链表、循环链表

数组(顺序表):
数组是一组具有相同类型和名称的变量的集合。变量称为数组的元素,每个数组元素都有一个编号,这个编号叫做下标,可以通过下标来区别这些元素。数组元素的个数称之为数组的长度
数组在实际的物理内存上也是连续存储的,数组有上界和下界
数组的特点是:数据连续,支持快速随机访问。
数组分为:
固定数组:大小必须在编译时就能够确认
动态数组:允许在运行时申请数组内存,java动态数组类型ArrayList和Vector。
(复杂点的数组是多维数组,多维数组实际上也是通过一维数组来实现的)

链表: (单向链表,双向链表、循环链表)
是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表可动态进行存储分配,可适应数据动态增减

单链表(单向链表):
链表由节点所构成,节点包含两个域,一个信息域和一个指针域—指向下一个节点的指针,节点依次链接成为链表,且最后一个节点则指向一个空值NULL。
单链表的节点链接是单方向的,要得到指定节点,必须从头遍历链表
单链表这种数据结构通常在物理内存上是不连续的。链表通常含有一个头节点,它含有一个指针,指向存放元素的第一个节点
单向链表添加节点:链表的插入元素操作时间复杂度O(1),只需要进行指针的指向修改操作
单向链表删除节点:单链表的删除操作时间复杂度O(1),只需修改节点的指针指针后即可销毁被删除节点

双链表(双向链表):
与单链表一样,双向节点由节点链接而成,只是每个节点含有两个指针,分别指向直接前驱与直接后继,且第一个节点的”前连接”指向NULL、最后一个节点的”后连接”指向NULL。
从双向链表的任何一个节点开始都能够遍历整个链表

双向链表添加节点:与单链表一样,双向链表添加节点的时间复杂度为O(1),只需修改相关指针的指向
双向链表删除节点:双向链表的删除操作时间复杂度为O(1)

循环链表
在一个循环链表中, 首节点和末节点被连接在一起(最后一个元素中保存的下一个元素指针指向第一个元素)。在单向和双向链表中皆可实现。

有序链表:优先级队列—即队列中数据项的值有序
数组实现:
数组头为队列尾,数组尾为队列头
队列中数据项的值从队列头至队列尾越来越大

数组、链表对比:
数组:
可随机访问,查询效率比链表高,数组不能随意扩大,不适合动态存储、动态添加数组元素,插入、删除操作不便,因为插入、删除操作会导致大量元素的移动
顺序存储结构、可随机读取,插入数据时间复杂度O(logn)、查找节点或访问特定的节点的时间复杂度是O(1)、增加和删除需要移动操作数所在位置后的所有数据,时间复杂度为O(N)
链表:
不能随机访问,必须是顺序访问,查询效率低,链表可以随意扩大,可动态添加、删除结点,插入、删除操作方便,不会导致元素的移动,只需要调整指针
链式存储结构(存储可不连续),链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但由于增加了结点的指针域,空间开销比较大。
链表是一种自我指示数据类型,它包含指向另一个相同类型的数据的指针。
链表插入和移除表上任意位置上的节点, 时间复杂度O(1)
链表不支持随机访问,查找节点或访问特定的节点的时间复杂度O(N)

应用:
需要快速访问数据,很少或不插入和删除元素,就应该用数组
需要经常插入和删除元素就需要用链表