JavaScript数据结构之链表

在说链表以前,先来康康基本数据结构--数组--
node

数组的特性以及优缺点

数组:在计算机科学中,数组数据结构,简称数组,是由相同类型的元素的集合所组成的数据结构,分配一块连续的内存来存储。利用元素的索引能够计算出该元素对应的存储地址。 最简单的数据结构类型是一维数组。数组-维基百科数组

数组的特性:
数据结构

  • 存储在物理结构上是连续的。数组所占用的内存空间必须是连续的,不能由两个或多个内存碎片存储。
  • 底层的数组长度是不可变的。为何说是底层的数组?由于JavaScript这类特殊的语言,像Java、Python等语言中声明数组时必须指定数组的长度,而且指定长度以后长度不可变化,若是对超过数组长度的内存进行操做会发生数组越界异常;而JavaScript中在声明数组时能够不指定数组长度,而且能够随意操做数组(添加、删除),缘由是js引擎在数组长度不够时进行了数组扩容

数组扩容:当数组长度不够用须要扩容时,此时须要系统从新分配一块扩容后长度的物理空间,而后将扩容前的数组元素复制到新的物理空间中,这个过程是消耗性能的。尤为是在数据量较大时,因此尽量避免发生数组扩容。性能

  • 数组的变量指向了数组的第一个元素。好比声明一个数组arr,那么arr其实指向的是数组的第一项的内存地址,因为在内存中数组是连续的,能够经过数组的第一项来访问整个数组中的全部元素。

数组的优势:this

  • 查询性能好,在查询某个位置的元素时尤其明显,因为数组在内存地址中是连续的,而且咱们经过arr[2]访问数组中的某个元素时,arr[n]其中的n其实为内存地址的偏移量,在操做系统中经过偏移量来进行查询效率是最高的。

数组的缺点:spa

  • 因为数组存储必须使用连续的物理空间,那么在数据量较大或者系统空间碎片较多时不易存储。
  • 因为数组长度定长,在对数组进行操做(插入、删除)时会带来性能的损耗。当在数组中间的某个部位插入或者删除一个元素时,此时须要将该位置后面的全部元素进行后移/前移,当数据量较大时性能损耗较大。

什么是链表

链表:链表是一种常见的基础数据结构,是一种线性表,可是并不会按线性的顺序存储数据,而是在每个节点里存到下一个节点的指针。因为没必要须按顺序存储,链表在插入的时候能够达到O(1)的复杂度,比另外一种线性表顺序表快得多,可是查找一个节点或者访问特定编号的节点则须要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。链表-维基百科操作系统

链表有单链表、双链表、循环链表,这里只介绍单链表。指针

使用JavaScript来建立一个简单的链表结构:code

function Node(value) {
    this.value = value;
    this.next = null;
}
let node1 = new Node(1);
let node2 = new Node(2);
let node3 = new Node(3);
let node4 = new Node(4);
let node5 = new Node(5);

let head = node1;

node1.next = node2;
node2.next = node3;
node3.next = node4;
node4.next = node5;
复制代码

链表的特性:cdn

  • 在空间上不是连续的。
  • 每存放一个值都会浪费一个引用空间。

注:

  • 传递链表必须传递链表的根节点(head)。
  • 每个节点都认为本身为根节点,不包含上一个节点的任何信息。

链表的优势:

  • 只要内存足够大,不用担忧空间碎片的问题。
  • 链表的添加删除很是容易(只需更改引用便可)。 好比在节点b和节点c之间想插入一个节点d,只需将节点b的引用指向节点d,而后将节点d的引用指向节点c便可。

链表的缺点:

  • 查询速度慢, 查询某个节点或者特定编号节点须要O(n)的时间
  • 会浪费一些空间。 每添加一个节点都须要建立一个引用来指向下一个节点(当节点内的数据量越大时这部分开销对内存的影响越小)

未完待续。。。

相关文章
相关标签/搜索