Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions Sprint-2/implement_skip_list/skip_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
import random

class Node:
def __init__(self, value, level):
self.value = value
self.forward = [None] * (level + 1) # forward pointers for each level

class SkipList:
MAX_LEVEL = 16
P = 0.5 # probability for random level

def __init__(self):
self.header = Node(None, self.MAX_LEVEL)
self.level = 0 # current max level in list

def random_level(self):
lvl = 0
while random.random() < self.P and lvl < self.MAX_LEVEL:
lvl += 1
return lvl

def insert(self, value):
update = [None] * (self.MAX_LEVEL + 1)
current = self.header

# Move down from top level to bottom to find insert positions
for i in reversed(range(self.level + 1)):
while current.forward[i] and current.forward[i].value < value:
current = current.forward[i]
update[i] = current

current = current.forward[0]

# Insert only if not already present
if current is None or current.value != value:
lvl = self.random_level()
if lvl > self.level:
for i in range(self.level + 1, lvl + 1):
update[i] = self.header
self.level = lvl

new_node = Node(value, lvl)
for i in range(lvl + 1):
new_node.forward[i] = update[i].forward[i]
update[i].forward[i] = new_node

def contains(self, value):
current = self.header
for i in reversed(range(self.level + 1)):
while current.forward[i] and current.forward[i].value < value:
current = current.forward[i]
current = current.forward[0]
return current is not None and current.value == value

def to_list(self):
result = []
current = self.header.forward[0]
while current:
result.append(current.value)
current = current.forward[0]
return result

# Make SkipList iterable
def __iter__(self):
current = self.header.forward[0]
while current:
yield current.value
current = current.forward[0]
Loading