一)线性表的定义
线性表是最简单、最常用的一种数据结构。是由n(n≥0)个数据元素(结点)a1,a2,…,an组成的有限序列。
对于非空的线性表:
- 有且仅有一个开始结点a1,没有直接前趋,有且仅有一个直接后继a2;
- 有且仅有一个终结结点an,没有直接后继,有且仅有一个直接前趋an-1;
- 其余的内部结点ai(2≤i≤n-1)都有且仅有一个直接前趋ai-1。
- 其余的内部结点ai(2≤i≤n-1)都有且仅有一个后继结点ai+1。
二)线性表的分类(按存储结构)
根据存储结构的不同,线性表分为顺序表和链表。
2.1)顺序表:用把线性表的结点按逻辑次序依次存放在一组地址连续的存储单元里的方法存储的线性表简称为顺序表。顺序表是用向量实现的线性表,向量的下标可以看作结点的相对地址。因此顺序表的的特点是逻辑上相邻的结点其物理位置亦相邻。
优点是存储空间的利用率高,存取速度快。缺点是无论是插入一个结点,还是删除一个结点,都要调整一批结点的地址。
2.2)链表:为了避免顺序表插入和删除的线性开销,我们需要保证表可以不连续存储。链表由一系列结点组成,这些结点不必在内存中连续,每一个结点包括实际数据和其后继结点的地址(指针、应用),通过这些地址将所有结点串起来,就形成了链表。其插入、删除操作就只需改变响应结点的地址即可。以上描述的链表为单向链表(默认就称为链表),如果结点不仅包括后继结点地址,而且包括前驱结点地址,那么称为双向链表。双向链表较之单向链表更方便链表的遍历(可以由后向前遍历)。
三)java中的线性表
在java的集合包中对顺序表和链表进行了实现,分别是ArrayList和LinkedList。结合顺序表和链表的特点,可以分析ArrayList和LinkedList的区别:
- ArrayList基于动态数组方式,LinkedList基于双向链表实现;
- ArrayList的存取要优于LinkedList,因为LinkedList需要移动指针;
- LinkedList的插入、删除要优于ArrayList,因为ArrayList需要移动数据。