(二)数据结构和算法:表

238 阅读3分钟

线性表的定义

首先元素之间是有顺序的,并且第一个元素无前驱,最后一个元素无后继,其他的元素都有且只有一个前驱和后继,这样才能形成线性表。


顺序存储结构

线性表的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。

1.png

就是在内存中找一块位置,把一定的内存空间占了,然后把相同数据类型的数据元素按顺序存放在这块位置中,线性表的每个数据元素类型都相同,所以在JAVA中可以通过数组来实现线性表的顺序存储结构

线性表顺序结构存储的优缺点
  • 优点:可以快速的存取表中任意位置的数据
  • 缺点:插入和删除需要移动元素,花费大量时间,并且当数组扩容时,难以确定存储空间的容量,容易造成存储空间的碎片化。

链式存储结构

链表用一组任意的存储单元来存储线性表的元素,这组存储单元可以连续也可以不连续,所以现在每个元素中除了要存储数据,还要存储其后继元素的存储地址。我们把存储数据元素信息的域称为数据域,把存储后继元素位置的域称为指针域,这两部分共同组成一个数据元素单元,我们把它叫做结点(Node)。

2.png

逻辑上相邻的两个元素,在内存中其实不是相邻的,而只需前一个元素知道后一个元素的地址,然后连起来

从链接方式来看
  • 单链表
  • 循环链表
  • 双链表
从实现角度来看
  • 动态链表
  • 静态链表
单链表

每个结点中的指针域只包含下一个结点的位置,叫做单链表。单链表的最后一个结点指向为null。

3.png

单链表的优缺点
  • 优点:执行插入和删除效率高,不需要事先分配空间,元素个数不受限制,不会浪费空间
  • 缺点:查找效率比较低

我们可以得出一些结论,若线性表需要频繁查找,很少进行插入和删除操作时,则使用顺序存储结构。反之,需要大量的插入和删除时,则使用链式存储结构。

循环链表

循环链表是一个首尾相连的链表,将单链表最后一个结点的地址域改为指向表头结点,就得到了单链循环链表,称为循环单链表。

双向链表

双向链表:就是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。所以在双向链表中的每个结点都有两个指针域,一个指向直接后继,一个指向直接前驱。

既然单链表可以有循环链表,那么双向链表当然也可以循环。

双向循环链表为空时

4.png

双向循环链表不为空时

5.png

双向循环链表就是典型的用空间换时间


JAVA API中的表实现
ArrayList的实现

顺序结构存储的线性表其实就是ArrayList的内部实现

LinkedList的实现 

LinkedList是一个双向链表,并且没有循环。