线性表描述

从数据的逻辑结构来分,数据元素之间存在的元素关系被称为数据的逻辑结构。归纳起来,应用程序中的数据大致如下4类基本的逻辑结构。

集合:数据元素之间只有“同属于一个集合”关系。

线性结构:数据元素之间存在一个对一个的关系。

树形结构:数据元素之间存在一个对多个的关系。

网状结构或图状结构:数据元素之间存在多个对多个的关系。

对于数据不同的逻辑结构,计算机在物理磁盘上通常有2种物理存储结构:

顺序存储结构;

链式存储结构。

对于常用数据结构,可以将其简单地分为线性结构和非线性结构,其中线性结构主要是线性表,而非线性结构则主要是树和图。

线性表(Linear List)是由n(n>=0)个数据元素(节点)组成的有限序列。线性表中每个元素必须具有相同的结构,即拥有相同的数据项。线性表是线性结构中最常用而又最简单的一种数据结构。

实现线性表的基本操作:

初始化:通常是一个构造器,用于创建一个空的线性表。

返回线性表的长度:该方法用于返回线性表中数据元素的个数。

获取指定索引处的元素:根据索引返回线性表中的数据元素。

按值查找数据元素的位置:如果线性表中存在一个或多个与查找值相等的数据元素,该方法返回第一个搜索值相等的数据元素的索引,否则返回-1。

直接插入数据元素:向线性表的头部插入一个数据元素,线性表长度+1。

删除线性表中指定位置的数据元素:删除线性表中指定索引处的数据元素,线性表长度-1。

判断线性表是否为空:该方法判断线性表是否为空,如果线性表为空,返回true,否则返回false。

清空线性表:将线性表清空。


线性表的顺序存储结构是指用一组地址连续的存储单元依次存放线性表的元素。当程序采用顺序存储结构来实现线性表时,线性表中相邻元素两个元素ai和ai+1对应的存储地址loc(ai)和loc(ai+1)也是相邻的。换句话说,顺序结构线性表中数据元素的物理关系和逻辑关系是一致的。

为了使用顺序结构实现线性表,程序通常会采用数组来保存线性表中的数据元素。ArrayList就是JDK为线性表所提供的顺序实现,它是非线性安全的。


链式存储结构也称链表,将采用一组地址任意的存储单元存放线性表中的数据元素。链式结构的线性表不会按线性的逻辑顺序来保存数据元素,它需要在每一个数据元素里保存一个引用下一个数据元素的引用,也叫指针。

由于不必须按顺序存储,链表在插入、删除元素时比顺序线性表快得多,但是查找一个节点或者访问特定编号的节点则比顺序线性表慢得多。

使用链表结构可以克服顺序线性表(基于数组)需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表结构失去了数组随机存取的优点。同时链表由于增加了节点的指针预,空间开销比较大。


单链表指的是每一个节点只保留一个引用,该引用指向当前节点的下一个节点,没有引用指向头节点,尾节点的next引用为Null.

循环链表是一种首尾相接的链表。将单链表的尾节点next指针改为引用单链表header节点,这个单链表就成了循环链表。

如果为每个节点保留两个引用prev和next,让prev指向当前节点的上一个节点,让next指向当前节点的下一个节点,此时的链表既可以向后依次访问每个节点,也可向前依次访问每个节点,这种形式的链表被称为双向链表。

双向链表是一种对称结构,它克服了单链表上指针单向性的缺点,其中每个节点既可向前引用,也可向后引用,这样可以更方便地插入、删除数据元素。


顺序表的存储空间是静态分布的,需要一个长度固定的数组,因此总有部分元素被浪费,但是因为逻辑顺序与物理存储顺序一致,一次你查找、读取时性能很好。

链表的存储空间是动态发布的,因此不会浪费空间,但是由于需要额外的空间来为每个节点保存指针,因此也要牺牲一部分空间,链表插入、删除元素时性能较好。


JDK中的LINKEDLIST就是一个双向链表。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值