链表学习-简介 [1]
1、链表介绍
1.1、链表是什么
链表(Linked list)是一种线性表,链表中的数据存储在一个个的节点里,节点不一定是连续存储的,在每一个节点中,除了存储数据以外,还会存储下一个节点的位置信息(内存地址),根据此位置信息(链接)可以找到下一个节点。
在链表的每一个节点中,分为不同的存储区域,信息域(元素域)和链接域(引用域)。
信息域用来存储该节点中具体保存的数据。
链接域用来存储指向的节点的位置信息(内存地址)。
链表的“头”指向第一个节点,第一个节点是链表的头节点(首节点),从头节点出发,可以依次找到链表中的所有节点。
节点是分散存储的,每个节点的链接域都可以指向空,将这些节点链接成一个链表,就是从头节点开始,链接域依次指向下一个节点,形成一个链。
1.2、 链表的分类
链表分为有head和无head链表,以下都是以有head链接为前提
-
单向链表
最简单的链表。它的每个节点包含两个域,一个信息域和一个链接域。链接域指向下一个节点,而最后一个节点的链接域指向一个空值(空指针nil) -
双向链表
双向链表又称双面链表,相对于单向链接,双向链表除了向后的链接域,还有向前的链接域。
每个节点包含三个域,一个信息域和两个链接域。一个链接域指向前一个节点,当此节点为第一个节点时,指向空值。
另一个链接域指向下一个节点,当此节点为最后一个节点时,指向空值
-
单向循环链表
单向循环链表是将单向链表首尾相连。
单向链表中最后一个节点的链接域指向的是空,而单向循环链表中,最后一个节点的链接域指向链表的头结点,形成一个“环形”的链
1.3、链表与数组的区别
数组和链表是两种截然不同的内存组织方式。正是因为内存存储的区别,它们插入、删除、随机访问操作的时间复杂度正好相反。
数组
- 优点:数组简单易用,在实现上使用的是连续的内存空间,可以借助CPU的缓存机制,预读数组中的数据,所以访问效率更高。
- 缺点:大小固定,一经声明就要占用整块连续内存空间。如果声明的数组过大,系统可能没有足够的连续内存空间分配给它,导致“内存不足(out of memory)”。如果声明的数组过小,则可能出现不够用的情况。这时只能再申请一个更大的内存空间,把原数组拷贝进去,非常费时
链表
-
优点:链表本身没有大小的限制,天然地支持动态扩容,这也是它与数组最大的区别。
-
缺点:链表在内存中并不是连续存储,所以对CPU缓存不友好,没办法有效预读。