第二章 2.6 线性表的第三类:纯链表及可能的缺点

来源:互联网 发布:电脑手写板软件下载 编辑:程序博客网 时间:2024/04/28 16:43

在链式数组表的基础上,我们进一步把元素部分也用链式思想完成,这就是纯链表。


因为每一个元素之间都通过指针链接,因此纯链表无法进行随机访问,无论是访问元素N,还是元素N+10,都必须从第一个元素开始依次遍历。

比起链式数组,无疑在随机存取方面效率会差得多,但同时,纯链表非常适合插入删除操作,因为不需要搬运元素,只需要改变指针的前后逻辑关系。


插入时仅仅改变两个指针的逻辑关系,其他元素不需要做任何操作。

删除元素时同样如此,效率极高。




值得注意的是,尽管纯链表的插入和删除效率很高,但总体完成一次插入或删除操作的效率并不高。
这是因为要插入或删除第i个节点,必须先找到第i-1个节点,复杂度为o(n)。
链式数组在插入删除的时候,要移动元素,复杂度为o(n)。
总体完成一次操作,纯链表与数组都是o(n)的复杂度,为什么教材和网路上都说,要频繁删除插入操作时,选链表?
我琢磨了好几天,都没想通。
至于说链表是动态结构,不需要预先分配空间,应需求及时生成,动态数组一样能实现该功能。
要说压倒性优势吧,只有在插入删除表头部分时,链表是o(1),数组为o(n)。


动态分配的链表可能会有如下缺点:


1. 造成内存泄漏;由于开发人员代码编写不谨慎,没能及时free掉malloc分配完成的内存。


2. 反复的malloc,free,会造成内存碎片化。


3. cache不友好,根据局部化原理,计算机系统会将连续的内存block读入cache,但是由于链表指针无法预测具体存


储位置,造成cache-miss 。


4. 链表也不节约空间,因为除了数据本身,还需要额外保存指针,反而会造成空间上的浪费。


这样一综合,实在看不出链表独特的优势在哪里,但是人们既然创造了链表,必定有其无法替代的地方,只是我初学

水平太低还没能领悟到。
0 0