Skip to content

Commit 22f8878

Browse files
1.添加JavaScript版本的SkipList的实现
2.修改JavaScript版本hashmap文件的序号
1 parent 17bbd62 commit 22f8878

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,3 +25,6 @@ hs_err_pid*
2525
# editor files
2626
.vscode
2727
.*.swp
28+
29+
# WebStorm
30+
.idea/

javascript/17_skiplist/SkipList.js

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
/**
2+
* author dreamapplehappy
3+
* 关于代码的一些解释可以看一下这里:https://github.com/dreamapplehappy/blog/tree/master/2018/12/02
4+
*/
5+
6+
const MAX_LEVEL = 16;
7+
8+
class Node{
9+
data = -1;
10+
maxLevel = 0;
11+
refer = new Array(MAX_LEVEL);
12+
}
13+
14+
class SkipList{
15+
levelCount = 1;
16+
head = new Node();
17+
18+
static randomLevel() {
19+
let level = 1;
20+
for(let i = 1; i < MAX_LEVEL; i++) {
21+
if(Math.random() < 0.5) {
22+
level++;
23+
}
24+
}
25+
return level;
26+
}
27+
28+
insert(value) {
29+
const level = SkipList.randomLevel();
30+
const newNode = new Node();
31+
newNode.data = value;
32+
newNode.maxLevel = level;
33+
const update = new Array(level).fill(new Node());
34+
let p = this.head;
35+
for(let i = level - 1; i >= 0; i--) {
36+
while(p.refer[i] !== undefined && p.refer[i].data < value) {
37+
p = p.refer[i];
38+
}
39+
update[i] = p;
40+
}
41+
for(let i = 0; i < level; i++) {
42+
newNode.refer[i] = update[i].refer[i];
43+
update[i].refer[i] = newNode;
44+
}
45+
if(this.levelCount < level) {
46+
this.levelCount = level;
47+
}
48+
}
49+
50+
find(value) {
51+
if(!value){return null}
52+
let p = this.head;
53+
for(let i = this.levelCount - 1; i >= 0; i--) {
54+
while(p.refer[i] !== undefined && p.refer[i].data < value) {
55+
p = p.refer[i];
56+
}
57+
}
58+
59+
if(p.refer[0] !== undefined && p.refer[0].data === value) {
60+
return p.refer[0];
61+
}
62+
return null;
63+
}
64+
65+
remove(value) {
66+
let _node;
67+
let p = this.head;
68+
const update = new Array(new Node());
69+
for(let i = this.levelCount - 1; i >= 0; i--) {
70+
while(p.refer[i] !== undefined && p.refer[i].data < value){
71+
p = p.refer[i];
72+
}
73+
update[i] = p;
74+
}
75+
76+
if(p.refer[0] !== undefined && p.refer[0].data === value) {
77+
_node = p.refer[0];
78+
for(let i = 0; i <= this.levelCount - 1; i++) {
79+
if(update[i].refer[i] !== undefined && update[i].refer[i].data === value) {
80+
update[i].refer[i] = update[i].refer[i].refer[i];
81+
}
82+
}
83+
return _node;
84+
}
85+
return null;
86+
}
87+
88+
printAll() {
89+
let p = this.head;
90+
while(p.refer[0] !== undefined) {
91+
// console.log(p.refer[0].data)
92+
p = p.refer[0];
93+
}
94+
}
95+
}

0 commit comments

Comments
 (0)