线性数据结构:线性数据结构强调的是存储与顺序。
一、数组(空间角度,必须连续)
数组定长:数组改变长度时,js会自动扩容(但是会消耗性能),所以建议创建数组时 预估数组长度,避免扩容带来的性能消耗。
数组特性:1.存储在物理空间上是连续的。
2.底层的数组长度是不可变的。
3.数组的变量,指向数组第一个元素的位置。
let a = [1,2,3,4,5,6];
a[1] //[1]:表示存储地址的偏移。
数组优点:1.查询性能好。(指定查询某个位置)
数组的缺点:1.因为空间必须是连续的。当系统的空间碎片较多且数组比较大时,
容易存不下。
2.因为数组的长度是固定的,所以数组的内容难以被添加和删除。
let arr = [1,2,3,4,5,6];(内容固定时可有使用)
//或
let arr = new Array(10);(内容不固定时使用)(推荐) //10为初始化长度
二、链表(空间角度,可以不连续)
链表:带有封装形式的数据结构。
let b = {
value:2,
next:null
},
let a = {
value:1,
next:b //指向b(地址)
}
console.log(a.next === b) //true
链表特点:
1.在空间上不是连续的。
2.每存放一个值,都要多开销一个引用空间。
链表优点:
1.只要内存足够大,就能存得下,不用担心空间碎片的问题。
2.链表的添加和删除非常的方便。(改变两个引用即可)。
链表缺点:
1.查询速度慢。(查寻指定位置时,要按照链表结构,从根节点依次查询)
(可避免) 2.链表每一个节点都需要创建一个指向next的引用,浪费空间。
如何避免链表缺点2:当节点内数据越多的时候,这部分多开销的内存影响越小。
重要:传递链表,必须传递链表的根节点(每一个节点,都认为自己是根节点),因为 链表的指向是单向的(每一个节点:只能找到下家,找不到上家)。
删除节点:改变上个节点的指向即可。(被删除的节点客观存在,但与链表无关)
如何创建列表:
//1.定义链表结构
function Node(value){ //定义的节点
this.value = value;
this.next = null;
}
let a = new Node(1);
let b = new Node(2);
let c = new Node(3);
let d = new Node(4);
a.next = b;
b.next = c;
c.next = d;
c.next = null;
console.log(a.value); //1
console.log(a.next.value); //2
console.log(a.next.next.value); //3
console.log(a.next.next.next.value); //4
注:一直next也不是办法,此时就需要借助算法来解决这一问题。