Skip to content

Commit 0bd1637

Browse files
committed
complete skip list
1 parent 84030f8 commit 0bd1637

1 file changed

Lines changed: 78 additions & 0 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import random
2+
3+
4+
class Node:
5+
def __init__(self, value, level):
6+
self.value = value
7+
self.next = [None] * level
8+
9+
10+
class SkipList:
11+
MAX_LEVEL = 16
12+
13+
def __init__(self):
14+
self.head = Node(None, self.MAX_LEVEL)
15+
self.level = 1
16+
17+
def random_level(self):
18+
level = 1
19+
20+
while (
21+
level < self.MAX_LEVEL
22+
and random.random() < 0.5
23+
):
24+
level += 1
25+
26+
return level
27+
28+
def insert(self, value):
29+
update = [None] * self.MAX_LEVEL
30+
31+
current = self.head
32+
33+
for level in range(self.level - 1, -1, -1):
34+
while (
35+
current.next[level] is not None
36+
and current.next[level].value < value
37+
):
38+
current = current.next[level]
39+
40+
update[level] = current
41+
42+
new_level = self.random_level()
43+
44+
if new_level > self.level:
45+
for level in range(self.level, new_level):
46+
update[level] = self.head
47+
48+
self.level = new_level
49+
50+
node = Node(value, new_level)
51+
52+
for level in range(new_level):
53+
node.next[level] = update[level].next[level]
54+
update[level].next[level] = node
55+
56+
def contains(self, value):
57+
current = self.head
58+
59+
for level in range(self.level - 1, -1, -1):
60+
while (
61+
current.next[level] is not None
62+
and current.next[level].value < value
63+
):
64+
current = current.next[level]
65+
66+
current = current.next[0]
67+
68+
return (
69+
current is not None
70+
and current.value == value
71+
)
72+
73+
def __contains__(self, value):
74+
return self.contains(value)
75+
76+
77+
78+

0 commit comments

Comments
 (0)