第3章 线性表

在数据结构中,线性表应该是最简答的一种结构了吧。因为自己实现过List接口(MyCollectionFrameWork),因此对线性表的理解比较透彻。

装完逼后我们继续按着书中的思路走:

首先作者也是装了一波逼,然后引出了线性表的定义

  • 线性表:0个或多个数据元素的有限序列

然后提出了线性表抽象数据类型的定义

  • 下面列出了线性表最基本的操作

    • 初始化操作

    • 判断线性表是否为空

    • 清空线性表

    • 获取线性表中任意一个位置的元素

    • 判断线性表是否包含指定元素

    • 在线性表的任意位置插入某一元素

    • 删除线性表中任一位置的某个元素

    • 获取线性表的元素个数

之后又提出了线性表两种物理结构之一的顺序存储结构:

  • 定义:用一段地址连续的存储单元依次存储线性表中的元素

  • 实现:使用一维数组实现,可查看jdk中的ArrayList实现,比较简单

  • 插入和删除:书中是用了一个美女插队的故事说明,我这边就只有图了,有兴趣可以自己去看故事去。

  • 总之,线性表的顺序存储无论是线性结构还是算法实现都比较简单,相信大家看看List源码的实现都能看懂,然后也可以自己写个顺序存储的线性表。

然而,顺序存储也存在种种缺点,如插入和删除需要移动大量元素,难以确定容量大小等,因此有了链式存储结构,书中分为单链表和双向链表分别进行阐述,这里直接以链表统称,以双链表为例,因为双链表和单链表本质一样:

  • 链表的实现关键是产生节点对象,每个节点用来存储一个元素,并使用头结点指向前一个节点,使用尾结点指向后一个节点

  • 总的来说,顺序存储是不断向数组里面添加或删除元素,而链式存储是不断产生节点对象或删除节点对象,下面说明了顺序存储和链式存储的对比:

然后又描述了循环链表

  • 将终端尾结点的指针引用指向头结点即可实现循环链表

最后,作者给了这样一张图,感觉挺有用的:

原文地址:https://www.cnblogs.com/realsoul/p/5862172.html