认真学习 JavaScript 数据结构
准备工作
比较器
一个比较器类拥有以下方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| compare: (a, b) => number
equal: (a: (number | string), b: (number | string)) => boolean
lessThan: (a: (number | string), b: (number | string)) => boolean
greaterThan: (a: (number | string), b: (number | string)) => boolean
lessThanOrEqual: (a: (number | string), b: (number | string)) => boolean
greaterThanOrEqual: (a: (number | string), b: (number | string)) => boolean
reverse: () => void
|
构造一个这样的比较器函数之后可以在后面的数据结构中进行使用
链表
在计算机科学中,链表是数据元素的线性集合,其中每个元素的顺序并不是由它们在内存中的物理位置给出的,而是每个元素都持有下一个元素的指针,它是一组节点组成的数据结构,这些节点一起表示序列,在最简单的形式下,每个节点由数据和到序列中下一个节点的引用组成的,这种结构允许在迭代的时候在任意位置有效的插入或者移除元素,更复杂的变体添加了额外的连接,允许有效插入或从任意元素引用删除,列表的缺点是访问时间是线性的(O(n),并且无法优化),例如数组的随机访问,在链表中是不可行的,与链表相比,数组局域更好的缓存局部性.

其支持一下几种主要的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
append(value: any): LinkedListInterface {
const newNode = new LinkedListNode(value) if (!this.head) { this.head = newNode this.tail = newNode return this }
this.tail.next = newNode
this.tail = newNode
return this
}
|
复杂度
时间复杂度
| 类型 |
访问 |
搜索 |
插入 |
删除 |
| 列表 |
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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| prepened(value: any): DoublyLinkedListInterface {
const newNode = new DoublyLinkedListNode(value)
if (this.hand) { this.hand.pervious = newNode } this.hand = newNode
if (!this.tail) { this.tail = newNode }
return this
}
|
其他的方面和单向链表差不多,写完之后代码测试就错了三处,可喜可贺