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
package main

import "math/rand/v2"

const (
maxLevel = 32
p = 0.25
)

type SkiplistNode struct {
val int
nxt []*SkiplistNode
}

type Skiplist struct {
head *SkiplistNode
level int
}

func Constructor() Skiplist {
return Skiplist{
head: &SkiplistNode{
val: -1,
nxt: make([]*SkiplistNode, maxLevel),
},
level: 0,
}
}

func (s *Skiplist) Search(target int) bool {
cur := s.head
for i := maxLevel - 1; i >= 0; i-- {
for cur.nxt[i] != nil && cur.nxt[i].val < target {
cur = cur.nxt[i]
}
}
cur = cur.nxt[0]
return cur != nil && cur.val == target
}

func (s *Skiplist) Add(num int) {
upd := make([]*SkiplistNode, maxLevel)
for i := range upd {
upd[i] = s.head
}

cur := s.head
for i := maxLevel - 1; i >= 0; i-- {
for cur.nxt[i] != nil && cur.nxt[i].val < num {
cur = cur.nxt[i]
}
upd[i] = cur
}

level := s.randomLevel()
s.level = max(s.level, level)

newNode := &SkiplistNode{
val: num,
nxt: make([]*SkiplistNode, level),
}
for i, node := range upd[:level] {
newNode.nxt[i] = node.nxt[i]
node.nxt[i] = newNode
}
}

func (s *Skiplist) Erase(num int) bool {
upd := make([]*SkiplistNode, maxLevel)

cur := s.head
for i := maxLevel - 1; i >= 0; i-- {
for cur.nxt[i] != nil && cur.nxt[i].val < num {
cur = cur.nxt[i]
}
upd[i] = cur
}
cur = cur.nxt[0]
if cur == nil || cur.val != num {
return false
}

for i := 0; i < s.level && upd[i].nxt[i] == cur; i++ {
upd[i].nxt[i] = cur.nxt[i]
}
for s.level > 1 && s.head.nxt[s.level-1] == nil {
s.level--
}
return true
}

func (s *Skiplist) randomLevel() int {
level := 1
for level < maxLevel && rand.Float64() < p {
level++
}
return level
}