冰冻非一日之寒
书本概念
链表是一种将数据存储到“结点”中的数据结构,需要存储多少个数据,就生成多少个“结点”,把这些“结点”用指针挂接起来。
为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置),这两部分信息组成数据元素ai的存储映像,称为结点。
结点中包括两个域,其中存储数据元素信息的域称为数据域;存储直接后继存储位置的域称为指针域。指针域中存储的信息称为指针。
慕课笔记
前面说过,对于链表数据是存储在结点中的。结点包括两部分,数据e和指针next,
说了这么多,举个例子吧。下图可以看做是一个链表,链表中共有三个结点,其中的1、2、3是数据e本身,而且箭头是next指针。链表不可能是无穷无尽的,对于最后一个结点,其next指针指向null,即指向了空结点。
可以看出,链表不像静态数组那样,一下子new出来一片空间,而是需要多少,就生成多少个空间(结点),只需要把他们挂接起来。也不需要考虑空间是否大了或者小了。
同时,这也是链表的缺点:失去了随机访问的能力。这是因为:
在底层机制上,数组开辟的空间在内存里是连续分布的,直接去找这个索引对应的偏移,直接计算出相应元素的内存地址,用O(1)的复杂度把这个元素取出;而链表是靠next一层一层连接的,在计算机的底层,每一个结点所在的内存位置是不同的(每new一个结点,计算机就会随机分配一个地址),只能靠next一点一点的去找到我们想要的元素
链表和数组对比:
数组最好用于索引有寓意的情况。例如,score[2],代表学号为2的,学生的成绩;数组支持快速查询。
链表不适合用于索引有语意的情况;链表是动态的。
何时使用二者,就要看我们的需求是适合动态的数据结构,还是适合静态的数据结构。
简单的编写下链表这个数据结构