在数据结构中,线性表应该是最简答的一种结构了吧。因为自己实现过List接口(MyCollectionFrameWork),因此对线性表的理解比较透彻。
装完逼后我们继续按着书中的思路走:
首先作者也是装了一波逼,然后引出了线性表的定义:
- 线性表:0个或多个数据元素的有限序列
然后提出了线性表抽象数据类型的定义:
-
下面列出了线性表最基本的操作:
-
初始化操作
-
判断线性表是否为空
-
清空线性表
-
获取线性表中任意一个位置的元素
-
判断线性表是否包含指定元素
-
在线性表的任意位置插入某一元素
-
删除线性表中任一位置的某个元素
-
获取线性表的元素个数
-
之后又提出了线性表两种物理结构之一的顺序存储结构:
-
定义:用一段地址连续的存储单元依次存储线性表中的元素
-
实现:使用一维数组实现,可查看jdk中的ArrayList实现,比较简单
-
插入和删除:书中是用了一个美女插队的故事说明,我这边就只有图了,有兴趣可以自己去看故事去。
- 总之,线性表的顺序存储无论是线性结构还是算法实现都比较简单,相信大家看看List源码的实现都能看懂,然后也可以自己写个顺序存储的线性表。
然而,顺序存储也存在种种缺点,如插入和删除需要移动大量元素,难以确定容量大小等,因此有了链式存储结构,书中分为单链表和双向链表分别进行阐述,这里直接以链表统称,以双链表为例,因为双链表和单链表本质一样:
-
链表的实现关键是产生节点对象,每个节点用来存储一个元素,并使用头结点指向前一个节点,使用尾结点指向后一个节点
-
总的来说,顺序存储是不断向数组里面添加或删除元素,而链式存储是不断产生节点对象或删除节点对象,下面说明了顺序存储和链式存储的对比:
然后又描述了循环链表:
- 将终端尾结点的指针引用指向头结点即可实现循环链表
最后,作者给了这样一张图,感觉挺有用的: