数据结构【五】- 链表【链表的介绍和实现】

一. 什么是链表

(一)线性数据结构

   我们之前已经学习了三种线性数据结构。他们的底层依然是“依托静态数组”,靠resize解决固定容量问题。

动态是相对用户来说的。但是链表是真正的动态数据结构

  • 动态数组
  • 队列
  • 链表     --   真正的动态数据结构

(二)为什么说链表很重要

  • 是真正的 / 最简单的动态数据结构。如果对于链表学习有基础,有利于学习更加复杂的动态数据结构。
  • 链表涉及到计算机领域一个非常重要的概念,“引用(或者指针)”,这个概念和内存相关。对链表更加深入的理解,可以帮助我么对引用 / 指针 / 计算机系统中和内存管理的相关话题有更加深刻的认识。
  • 链表本身有非常请晰的递归结构。只不过由于链表本身是一种线性的数据结构,所以我们可以非常容易的'使用循环的方式对链表进行操作。但是链表本身具有递归结构的性质,所以它可以帮助深入理解递归机制。
  • 链表本身具有功能性,可以用来辅助组成更加复杂的数据结构,例如:图结构 / 哈希表 。同时对于 栈 / 队列 ,也可以用链表实现。

二. 链表结构的介绍

1. 数据存储在“节点”(Node)中

class Node{
    E e;
    Node next;
}

(1)当前节点存储两个内容:

  • 1. 当前节点的值
  • 2. 指向当前节点的下一个节点

(2)例如

一个链表就像一节火车,每一个节点就像一节车厢,我们在车厢内存储真正的数据。车厢之间要进行连接,使得我们的数据是整合在一起的,用户可以方便在所有的数据中进行操作。数据的连接使用next完成的。

链表存储的数据是有限的,最后一个节点存储的next就是NULL。所以如果一个节点的next是NULL,这就说明它存储的是最后一个节点。

比如一个火车有10节车厢,车厢头是 "1",车厢尾是 "10"

对于车厢"8"来说,它存储的两个内容是:

当前值“章”,它的下一个车厢 "9",其中车厢“9”中包含了车厢“10”.

对于车厢"1"来说,它存储的两个内容是:

当前值“填”,它的下一个车厢 "2",其中车厢“2”包含了后面所有的车厢。

                                            1  --->  2 --->  3  ---> 4  --->  5  --->  6  --->  7   -->  8  ---> 9 --->  10 --> NULL

 2. 优点:真正的动态,不需要处理固定容量的问题

对于链表来说,你需要多少个数据,就可以生成多少个节点,把他们挂接起来。

 3. 缺点:丧失了随机访问的能力

相比较数组来说,数组可以给个索引,直接从数组中拿到对应的值。这是因为从底层机制来说,数组开辟的空间从内存上来说,是连续分布的,所以我们可以直接寻找这个索引对应的偏移,直接计算出相应的数据所存储的内存地址。

但是链表不同,由于链表是靠next一层一层连接的,所以在计算机的底层,每一个节点所在的内存的位置是不同的。我们必须依靠next一点一点找到我们想要找的元素。

以上所有内容都是通过"慕课网"听"liuyubobobo"的《玩转数据结构》课程后总结

猜你喜欢

转载自blog.csdn.net/sunshine77_/article/details/88255588