Skip to content

Commit 4e84dec

Browse files
committed
Implement skip list insert, search, and to_list methods
1 parent f13588d commit 4e84dec

1 file changed

Lines changed: 75 additions & 0 deletions

File tree

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

0 commit comments

Comments
 (0)