顺序表和链表是线性表的两种实现方式,都用来存储逻辑关系为“一对一”的数据。
顺序表和链表最本质上的不同,在于它们存储数据的方式,或者说存储结构不同。顾名思义,顺序表是将数据按照次序存储起来,并且数据集中存放在内存中;链表是将数据通过指针"链"起来,各个数据元素可以随意存储在内存中。
顺序表和链表在存储结构上的区别,如下图所示:
图 1 顺序表和链表的区别
不同的存储结构,导致了顺序表和链表有以下几个方面的区别。
1、开辟内存空间的方式
顺序表需要将所有数据集中存放在内存空间中,因此往往会一次性申请大量的空间,打好提前量,以备后续使用。
链表存储数据时,讲究用多少内存就申请多少,后续需要可以再申请。
也就是说,在申请内存空间这件事情上,顺序表需要未雨绸缪,而链表只顾眼下即可。实际开发中,当数据量不确定,又或者内存“碎片化”严重,无法申请足够大的一整块空间,就可以尝试用链表存储数据。
所谓“内存碎片”,指的是那些因容量很小(1KB甚至更小)无法再利用的内存空间。
2、空间利用率
关于顺序表和链表在空间利用率上的对比,有两种完全不同的说法。