线性表-1.顺序表和链表

  把所有数据用一根线儿串起来,再存储到物理空间中, 一对一关系

线性表分为以下两种

    顺序存储结构(顺序表)                             链式存储结构(链表)

术语表示:

某一元素的左侧相邻元素称为“直接前驱”,位于此元素左侧的所有元素都统称为“前驱元素”;
某一元素的右侧相邻元素称为“直接后继”,位于此元素右侧的所有元素都统称为“后继元素”;

1.顺序表

俗称数组

使用顺序表存储数据之前,除了要申请足够大小的物理空间之外,为了方便后期使用表中的数据,顺序表还需要实时记录以下 2 项数据:

  顺序表申请的存储容量;
  顺序表的长度,也就是表中存储数据元素的个数;

插入:

  将要插入位置元素以及后续的元素整体向后移动一个位置;
  将元素放到腾出来的位置上;

                                                      

删除:

  后续元素整体前移一个位置,会直接将目标元素删除,可间接实现删除元素的目的。

                                                      

查找

后面章节介绍(查找算法)

修改

找到目标元素
直接修改该元素的值

2.链表

与顺序表不同,链表不限制数据的物理存储状态,换句话说,使用链表存储的数据元素,其物理存储位置是随机的。

链表中每个数据的存储都由以下两部分组成:

  数据元素本身,其所在的区域称为数据域;
  指向直接后继元素的指针,所在的区域称为指针域;

                                                      

所示的结构在链表中称为节点

头指针:

  一个普通的指针,它的特点是永远指向链表第一个节点的位置。
  很明显,头指针用于指明链表的位置,便于后期找到链表并使用表中的数据;

节点:
链表中的节点又细分为头节点、首元节点和其他节点:

头节点:
其实就是一个不存任何数据的空节点,通常作为链表的第一个节点。对于链表来说,头节点不是必须的,它的作用只是为了方便解决某些实际问题;

首元节点:
由于头节点(也就是空节点)的缘故,链表中称第一个存有数据的节点为首元节点。首元节点只
是对链表中第一个存有数据节点的一个称谓,没有实际意义;

其他节点: 链表中其他的节点;

                                            


顺序表和链表的区别以及优缺点:

顺序表存储数据,需预先申请一整块足够大的存储空间,然后将数据按照次序逐一存储,数据之间紧密贴合,不留一丝空隙

链表的存储方式与顺序表截然相反,什么时候存储数据,什么时候才申请存储空间,数据之间的逻辑关系依靠每个数据元素携带的指针维持

开辟空间的方式:

顺序表:存储数据实行的是 "一次开辟,永久使用",即存储数据之前先开辟好足够的存储空间,空间一旦开辟后期无法改变大小(使用动态数组的情况除外)。

链表:存储数据时一次只开辟存储一个节点的物理空间,如果后期需要还可以再申请。

因此,若只从开辟空间方式的角度去考虑,当存储数据的个数无法提前确定,又或是物理空间使用紧张以致无法一次性申请到足
够大小的空间时,使用链表更有助于问题的解决

空间利用率:

从空间利用率的角度上看,顺序表的空间利用率显然要比链表高

这是因为,链表在存储数据时,每次只申请一个节点的空间,且空间的位置是随机的,

这种申请存储空间的方式会产生很多空间碎片,一定程序上造成了空间浪费。不仅如此,由于链表中每个数据元素都必须携带至
少一个指针,因此,链表对所申请空间的利用率也没有顺序表高。

空间碎片: 指的是某些容量很小(1KB 甚至更小)以致无法得到有效利用的物理空间。

时间复杂度:

查找

顺序表中存储的元素可以使用数组下标直接访问,无需遍历整个表,因此使用顺序表
访问元素的时间复杂度为 O(1);

而在链表中访问数据元素,需要从表头依次遍历,直到找到指定节点,花费的时间复杂度为 O(n)

插入、删除:

链表中数据元素之间的逻辑关系靠的是节点之间的指针,当需要在链表中某处插入或删除节点时,
只需改变相应节点的指针指向即可,无需大量移动元素,因此链表中插入、删除或移动数据所耗费的时间复杂度为 O(1);

而顺序表中,插入、删除和移动数据可能会牵涉到大量元素的整体移动,因此时间复杂度至少为 O(n)


猜你喜欢

转载自www.cnblogs.com/hornets/p/12690599.html