一维数据结构(线性数据结构)—— 链表
我们先回顾一下上一节分享的数组
没有看过上一节的小伙伴快戳:数据结构与算法(二)
既然数组有这么多的缺点,那我们还用他吗?其实,不管你是学习什么语言的,数组都是在系统中内定好的,每个语言都一样,这样就给我们提供了很大的便利,但是由于存储他的内存空间必须是连续的,如果我们真的有一个非常多的数据要存的时候,很有可能有存不下的情况。那么接下来就到“链表”出场了。
在线性数据结构中,数组就相当于一条直线,而链表呢?就相当于一条锁链,可以随意的弯曲,并且可以不连续,只要上一个保存了下一个的引用即可。什么意思呢?我们来详细解释下:
什么叫上一个保存下一个的引用呢?如下如:
第一个对象保存了下一个对象的地址,下一个对象又保存了再下一个对象的地址…最后的对象保存的地址则是null。这就形成了一种链形结构。因此说,链表内存的数据可以在内存上不连续,现在就可以理解了,因为只要上一个保存了下一个的地址,就可以找到下一个对象的值,没必要在内存空间上一定是连续的。用代码解释上图就是这样的:
var a = { value: 1, next: b }
var b = { value: 2, next: c }
var c = { value: 3, next: c }
var d = { value: 4, next: null }
1. 链表特性:
1)存储在物理空间上可以不连续
2)每存放一个值,都要多开销一个引用空间
因为想要存储一个值,就必须再有一个next属性来存储下一个值的引用,所以会有一些浪费
1. 链表优缺点:
优点: 1)链表的添加和删除非常容易
链表的添加:比如我想在2和3中间添加一个5,直接就可以创建一个5的对象,让2的引用指向5,5的引用指向3即可。与数组的扩容并不相同,大大提高了效率。如下如
删除一个数据时,只需要将指向被删除的数据引用指向下一个就可以,如下如再删除5:
虽然5的对象看起来好像并没有被删除,但是他已经不在链表中了,只是有个引用指向了链表的某一项而已。
2)只要内存足够大,就能存的下,不用担心内存碎片的问题
缺点: 1)查询速度慢
比如我想查询第四个节点的内容,只能从第一个开始一次向下找,并不能像数组一样直接输入偏移量,因为链表不是连续的。
2)链表每一个节点都需要创建一个指向next的引用,浪费一些空间。(当节点内数据越多的时候,这部分开销的内存影响越小)
那么链表如何创建呢?代码如下
function Node(value) {
this.value = value;
this.next = null;
}
var node1 = new Node(1)
var node2 = new Node(2)
var node3 = new Node(3)
var node4 = new Node(4)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = null
console.log(node1.value) // 1
console.log(node1.next.value) // 2
console.log(node1.next.next.value) // 3
console.log(node1.next.next.next.value) // 4
这么写看似没有问题,但是如果我要查第100个数呢?第1000个数呢?
这样肯定不是个办法,所以我们需要一个算法,来方便的找到我们想要的值。那么今天的分享就到这里啦~
下一节我们分享数组和链表的遍历呦~ 下课