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