/
linked_list.js
140 lines (125 loc) · 3.09 KB
/
linked_list.js
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/**
* Node 定义一个节点
* @param element
* @param next
* */
class Node {
constructor(element, next) {
this.element = element;
this.next = next;
}
}
/**
* LinkedList 定义一个链表
*
* 属性
* head 表头
* tail 表尾
*
* 方法
* insert 插入一个节点
* remove 删除一个节点
* find 查找一个节点
* push 表尾添加一个节点
* shift 表头删除一个节点
* display 显示当前链表中的元素
* */
class LinkedList {
constructor({ head = null, tail = null, size = 0 } = {}) {
this.tail = tail;
this.head = head || new Node(null, this.tail); // 表头的 element 始终占 null
this.size = size;
}
push(element) {
const newNode = new Node(element, null);
if (!this.tail) { // 空表
this.tail = newNode;
this.head.next = this.tail;
} else { // 非空表
this.tail.next = newNode;
this.tail = newNode;
}
this.size++;
return this.size;
}
shift() {
const targetNode = this.head.next;
if (!targetNode) return null;
this.head.next = targetNode.next;
targetNode.next = null;
this.size--;
if (targetNode === this.tail) this.tail = null;
return targetNode;
}
insert(element, after) {
const newNode = new Node(element, null);
const afterEle = this.find(after);
if (!afterEle) return false;
newNode.next = afterEle.next;
afterEle.next = newNode;
this.size++;
return true;
}
remove(element) {
let curNode = this.head;
while (curNode.next) {
if (curNode.next.element === element) {
const prevNode = curNode;
const targetNode = curNode.next;
prevNode.next = targetNode.next;
targetNode.next = null;
this.size--;
}
curNode = curNode.next;
}
}
find(element) {
let curNode = this.head;
while (curNode.next !== null) {
curNode = curNode.next;
if (curNode.element === element) return curNode;
}
return null;
}
display() {
let curNode = this.head;
while (curNode.next !== null) {
curNode = curNode.next;
console.log(curNode);
}
}
}
function competingTest() {
console.time('generate a big Array from new Array');
const newArr = new Array(1e7);
for (let i = 0; i < newArr.length; i++) {
newArr[i] = i;
}
console.timeEnd('generate a big Array from new Array');
console.time('generate a big Array form Array.prototype.push');
const newArr2 = [];
for (let i = 0; i < 1e7; i++) {
newArr2.push(i);
}
console.timeEnd('generate a big Array form Array.prototype.push');
console.time('operate a big Array');
for (let i = 0; i < 100; i++) {
newArr.shift();
}
console.timeEnd('operate a big Array');
console.time('generate a big LinkedList');
const newLinkedList = new LinkedList();
for (let i = 0; i < 1e7; i++) {
newLinkedList.push(i);
}
console.timeEnd('generate a big LinkedList');
console.time('operate a big LinkedList');
for (let i = 0; i < 100; i++) {
newLinkedList.shift();
}
console.timeEnd('operate a big LinkedList');
}
competingTest();
module.exports = {
LinkedList,
};