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
78 changes: 78 additions & 0 deletions Sprint-2/implement_skip_list/skip_list.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import random


class Node:
def __init__(self, value, level):
self.value = value
self.next = [None] * level


class SkipList:
MAX_LEVEL = 16

def __init__(self):
self.head = Node(None, self.MAX_LEVEL)
self.level = 1

def random_level(self):
level = 1

while (
level < self.MAX_LEVEL
and random.random() < 0.5
):
level += 1

return level

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

current = self.head

for level in range(self.level - 1, -1, -1):
while (
current.next[level] is not None
and current.next[level].value < value
):
current = current.next[level]

update[level] = current

new_level = self.random_level()

if new_level > self.level:
for level in range(self.level, new_level):
update[level] = self.head

self.level = new_level

node = Node(value, new_level)

for level in range(new_level):
node.next[level] = update[level].next[level]
update[level].next[level] = node

def contains(self, value):
current = self.head

for level in range(self.level - 1, -1, -1):
while (
current.next[level] is not None
and current.next[level].value < value
):
current = current.next[level]

current = current.next[0]

return (
current is not None
and current.value == value
)

def __contains__(self, value):
return self.contains(value)




Loading