JavaScript 算法与数据结构
认真学习 JavaScript 数据结构
准备工作
比较器
一个比较器类拥有以下方法:
1 | // 类接收一个可选的比较函数作为参数 |
构造一个这样的比较器函数之后可以在后面的数据结构中进行使用
链表
在计算机科学中,链表是数据元素的线性集合,其中每个元素的顺序并不是由它们在内存中的物理位置给出的,而是每个元素都持有下一个元素的指针,它是一组节点组成的数据结构,这些节点一起表示序列,在最简单的形式下,每个节点由数据
和到序列中下一个节点的引用
组成的,这种结构允许在迭代的时候在任意位置有效的插入或者移除元素,更复杂的变体添加了额外的连接,允许有效插入或从任意元素引用删除,列表的缺点是访问时间是线性的(O(n),并且无法优化),例如数组的随机访问,在链表中是不可行的,与链表相比,数组局域更好的缓存局部性.
其支持一下几种主要的方法:
- 插入
1 |
|
- 搜索
- 删除
- 反转
- 反向遍历
复杂度
时间复杂度
类型 | 访问 | 搜索 | 插入 | 删除 |
---|---|---|---|---|
列表 | O(n) | O(n) | O(1) | O(1) |
数组 | O(1) | O(n) | O(n) | O(n) |
空间复杂度
O(n)
双向链表
在计算机科学中,双向链表是一种线性数据结构,由一组被称为节点的顺序连接记录组成,每个节点包含两个字段,称为链接,节点中有上一个节点和下一个节点的引用,可以被概念化为由两个相同数据形成的两个链表,但是以相反的顺序组成
构成双向链表的基本方法
- insert
- delte
- reverse traversal
相关复杂度
Access(访问) | Search | insertin | deleteion |
---|---|---|---|
O(n) | O(n) | O(1) | O(1) |
空间复杂度
O(n)
笔记
双向链表顾名思义,就是每个节点都由三个部分
组成
- 上个节点的引用
- 下个节点的引用
- 节点存储的值
prepend
1 | /** 向节点头部插入值 */ |
其他的方面和单向链表差不多,写完之后代码测试就错了三处,可喜可贺