1+ import random
2+
3+ MAX_LEVEL = 4
4+
5+
6+ class Node :
7+ def __init__ (self , value , level ):
8+ self .value = value
9+ self .forward = [None ] * level
10+
11+
112class SkipList :
213 def __init__ (self ):
3- self .items = []
14+ self .head = Node (None , MAX_LEVEL )
15+ self .level = 1
16+
17+ def _random_level (self ):
18+ level = 1
19+
20+ while level < MAX_LEVEL and random .random () < 0.5 :
21+ level += 1
22+
23+ return level
424
525 def insert (self , value ):
6- left = 0
7- right = len ( self .items )
26+ update = [ None ] * MAX_LEVEL
27+ current = self .head
828
9- while left < right :
10- mid = (left + right ) // 2
29+ for i in range (self .level - 1 , - 1 , - 1 ):
30+ while (
31+ current .forward [i ] is not None
32+ and current .forward [i ].value < value
33+ ):
34+ current = current .forward [i ]
1135
12- if self .items [mid ] < value :
13- left = mid + 1
14- else :
15- right = mid
36+ update [i ] = current
1637
17- self .items . insert ( left , value )
38+ node_level = self ._random_level ( )
1839
19- def __contains__ (self , value ):
20- left = 0
21- right = len (self .items ) - 1
40+ if node_level > self .level :
41+ for i in range (self .level , node_level ):
42+ update [i ] = self .head
43+
44+ self .level = node_level
2245
23- while left <= right :
24- mid = (left + right ) // 2
46+ new_node = Node (value , node_level )
2547
26- if self .items [mid ] == value :
27- return True
48+ for i in range (node_level ):
49+ new_node .forward [i ] = update [i ].forward [i ]
50+ update [i ].forward [i ] = new_node
51+
52+ def __contains__ (self , value ):
53+ current = self .head
2854
29- if self .items [mid ] < value :
30- left = mid + 1
31- else :
32- right = mid - 1
55+ for i in range (self .level - 1 , - 1 , - 1 ):
56+ while (
57+ current .forward [i ] is not None
58+ and current .forward [i ].value < value
59+ ):
60+ current = current .forward [i ]
3361
34- return False
62+ current = current .forward [0 ]
63+
64+ return current is not None and current .value == value
3565
3666 def to_list (self ):
37- return list (self .items )
67+ result = []
68+ current = self .head .forward [0 ]
69+
70+ while current is not None :
71+ result .append (current .value )
72+ current = current .forward [0 ]
73+
74+ return result
0 commit comments