class SkipList {
constructor (max_level=10, p=0.5) {
this.level = 1;
this.maxLevel = max_level;
this.p = p;
this.header = new Node(-Infinity, null, this.maxLevel);
}
Insert (key, val) {
let update = newArray(this.maxLevel, NIL);
let x = this.header;
for (let i = this.level - 1; i >= 0; i--) {
while (x.forward[i].key < key) {
x = x.forward[i];
}
update[i] = x;
}
x = x.forward[0]
if (x.key == key) {
x.val = val;
}
else {
let new_level = this.randomLevel();
if (new_level > this.level) {
for (let i = this.level; i < new_level; i++) {
update[i] = this.header;
}
this.level = new_level;
}
x = new Node(key, val, new_level);
for (let i=0; i<new_level; i++) {
x.forward[i] = update[i].forward[i];
update[i].forward[i] = x;
}
}
}
Search (key) {
let x = this.header;
for (let i = this.level - 1; i >= 0; i--) {
while (x.forward[i].key < key) {
x = x.forward[i];
}
}
x = x.forward[0];
if (x.key == key) {
return x.val;
} else {
return undefined;
}
}
Delete (key) {
let update = newArray(this.maxLevel, NIL);
let x = this.header;
for (let i=this.level - 1; i >= 0; i--) {
while (x.forward[i].key < key) {
x = x.forward[i];
}
update[i] = x;
}
x = x.forward[0];
if (x.key === key) {
for (let i = 0; i < this.level; i++) {
if (update[i].forward[i] != x) {
break;
}
else {
update[i].forward[i] = x.forward[i];
}
}
while (this.level > 0 && this.header.forward[this.level] === NIL) {
this.level--;
}
} else {
throw `Key Error: key '${key}' not found.`;
}
}
toString() {
let s = "header";
let x = this.header;
while (x.forward[0] != NIL) {
x = x.forward[0]
s = s + ` -> [${x.key}|${x.val}]`;
}
return s + " -> NIL";
}
randomLevel () {
let level = 1;
while (Math.random() < this.p) {
level++;
}
return level
}
};