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