面试必备——数据结构与算法(三)

一维数据结构(线性数据结构)—— 链表

我们先回顾一下上一节分享的数组

没有看过上一节的小伙伴快戳:数据结构与算法(二)

既然数组有这么多的缺点,那我们还用他吗?其实,不管你是学习什么语言的,数组都是在系统中内定好的,每个语言都一样,这样就给我们提供了很大的便利,但是由于存储他的内存空间必须是连续的,如果我们真的有一个非常多的数据要存的时候,很有可能有存不下的情况。那么接下来就到“链表”出场了。
在这里插入图片描述
在线性数据结构中,数组就相当于一条直线,而链表呢?就相当于一条锁链,可以随意的弯曲,并且可以不连续,只要上一个保存了下一个的引用即可。什么意思呢?我们来详细解释下:
什么叫上一个保存下一个的引用呢?如下如:
在这里插入图片描述
第一个对象保存了下一个对象的地址,下一个对象又保存了再下一个对象的地址…最后的对象保存的地址则是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个数呢?
在这里插入图片描述
这样肯定不是个办法,所以我们需要一个算法,来方便的找到我们想要的值。那么今天的分享就到这里啦~
下一节我们分享数组和链表的遍历呦~ 下课

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值