Skip to content

Commit 10f9011

Browse files
Add skip_list implementation
1 parent 1f19d92 commit 10f9011

File tree

1 file changed

+94
-0
lines changed

1 file changed

+94
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
import random
2+
3+
class SkipListNode:
4+
def __init__(self, value, level):
5+
self.value = value
6+
self.next = [None] * (level + 1) # Next nodes at each level
7+
8+
class SkipList:
9+
def __init__(self):
10+
self.max_level = 16
11+
self.head = SkipListNode(None, self.max_level) # Head node
12+
self.level = 0 # Current highest level
13+
self.size = 0
14+
15+
def _random_level(self):
16+
"""Generate random level for a new node (coin flip)"""
17+
level = 0
18+
while random.random() < 0.5 and level < self.max_level:
19+
level += 1
20+
return level
21+
22+
def __contains__(self, key):
23+
"""Support 'in' operator"""
24+
return self.contains(key)
25+
26+
def contains(self, key):
27+
"""Check if key exists in the skip list"""
28+
current = self.head
29+
30+
# Start from highest level and move down
31+
for i in range(self.level, -1, -1):
32+
while current.next[i] and current.next[i].value < key:
33+
current = current.next[i]
34+
35+
# Move to the node that might contain the value
36+
current = current.next[0]
37+
return current is not None and current.value == key
38+
39+
def insert(self, value):
40+
"""Insert a value into the skip list"""
41+
update = [None] * (self.max_level + 1)
42+
current = self.head
43+
44+
# Find the position to insert and track update pointers
45+
for i in range(self.level, -1, -1):
46+
while current.next[i] and current.next[i].value < value:
47+
current = current.next[i]
48+
update[i] = current
49+
50+
current = current.next[0]
51+
52+
# If value already exists, we'll still insert it (allow duplicates)
53+
new_level = self._random_level()
54+
55+
# Update the max level if needed
56+
if new_level > self.level:
57+
for i in range(self.level + 1, new_level + 1):
58+
update[i] = self.head
59+
self.level = new_level
60+
61+
# Create new node
62+
new_node = SkipListNode(value, new_level)
63+
64+
# Update pointers at each level
65+
for i in range(new_level + 1):
66+
new_node.next[i] = update[i].next[i]
67+
update[i].next[i] = new_node
68+
69+
self.size += 1
70+
71+
def to_list(self):
72+
"""Convert skip list to a sorted list"""
73+
result = []
74+
current = self.head.next[0] # Start from first element at level 0
75+
76+
while current:
77+
result.append(current.value)
78+
current = current.next[0]
79+
80+
return result
81+
82+
def __str__(self):
83+
"""String representation for debugging"""
84+
result = []
85+
for level in range(self.level, -1, -1):
86+
level_str = f"Level {level}: "
87+
current = self.head.next[level]
88+
elements = []
89+
while current:
90+
elements.append(str(current.value))
91+
current = current.next[level]
92+
level_str += " -> ".join(elements) if elements else "empty"
93+
result.append(level_str)
94+
return "\n".join(result)

0 commit comments

Comments
 (0)