3rdworld

导航

链表学习-简介 [1]

1、链表介绍



1.1、链表是什么

链表(Linked list)是一种线性表,链表中的数据存储在一个个的节点里,节点不一定是连续存储的,在每一个节点中,除了存储数据以外,还会存储下一个节点的位置信息(内存地址),根据此位置信息(链接)可以找到下一个节点。

在链表的每一个节点中,分为不同的存储区域,信息域(元素域)和链接域(引用域)。

信息域用来存储该节点中具体保存的数据。

链接域用来存储指向的节点的位置信息(内存地址)。

链表的“头”指向第一个节点,第一个节点是链表的头节点(首节点),从头节点出发,可以依次找到链表中的所有节点。

节点是分散存储的,每个节点的链接域都可以指向空,将这些节点链接成一个链表,就是从头节点开始,链接域依次指向下一个节点,形成一个链。



1.2、 链表的分类

链表分为有head和无head链表,以下都是以有head链接为前提

  • 单向链表
    最简单的链表。它的每个节点包含两个域,一个信息域和一个链接域。链接域指向下一个节点,而最后一个节点的链接域指向一个空值(空指针nil)

  • 双向链表

    双向链表又称双面链表,相对于单向链接,双向链表除了向后的链接域,还有向前的链接域。

    每个节点包含三个域,一个信息域和两个链接域。一个链接域指向前一个节点,当此节点为第一个节点时,指向空值。

    另一个链接域指向下一个节点,当此节点为最后一个节点时,指向空值

  • 单向循环链表

    单向循环链表是将单向链表首尾相连。

    单向链表中最后一个节点的链接域指向的是空,而单向循环链表中,最后一个节点的链接域指向链表的头结点,形成一个“环形”的链



1.3、链表与数组的区别

数组和链表是两种截然不同的内存组织方式。正是因为内存存储的区别,它们插入、删除、随机访问操作的时间复杂度正好相反。

数组

  • 优点:数组简单易用,在实现上使用的是连续的内存空间,可以借助CPU的缓存机制,预读数组中的数据,所以访问效率更高。
  • 缺点:大小固定,一经声明就要占用整块连续内存空间。如果声明的数组过大,系统可能没有足够的连续内存空间分配给它,导致“内存不足(out of memory)”。如果声明的数组过小,则可能出现不够用的情况。这时只能再申请一个更大的内存空间,把原数组拷贝进去,非常费时

链表

  • 优点:链表本身没有大小的限制,天然地支持动态扩容,这也是它与数组最大的区别。

  • 缺点:链表在内存中并不是连续存储,所以对CPU缓存不友好,没办法有效预读。

posted on 2020-06-13 20:47  3rdworld  阅读(56)  评论(0编辑  收藏  举报