python
import random
class SkipNode:
def __init__(self, key, level):
self.key = key
self.forward = [None] * level
class SkipList:
def __init__(self, p=0.5, max_level=16):
self.p = p
self.max_level = max_level
self.level = 1
self.head = SkipNode(None, max_level)
def random_level(self):
level = 1
while (
level < self.max_level
and random.random() < self.p
):
level += 1
return level
def search(self, key):
current = self.head
for i in range(self.level - 1, -1, -1):
while (
current.forward[i] is not None
and current.forward[i].key < key
):
current = current.forward[i]
current = current.forward[0]
return (
current is not None
and current.key == key
)
def insert(self, key):
update = [None] * self.max_level
current = self.head
for i in range(self.level - 1, -1, -1):
while (
current.forward[i] is not None
and current.forward[i].key < key
):
current = current.forward[i]
update[i] = current
current = current.forward[0]
if current is not None and current.key == key:
return False
new_level = self.random_level()
if new_level > self.level:
for i in range(self.level, new_level):
update[i] = self.head
self.level = new_level
node = SkipNode(key, new_level)
for i in range(new_level):
node.forward[i] = update[i].forward[i]
update[i].forward[i] = node
return True
def delete(self, key):
update = [None] * self.max_level
current = self.head
for i in range(self.level - 1, -1, -1):
while (
current.forward[i] is not None
and current.forward[i].key < key
):
current = current.forward[i]
update[i] = current
current = current.forward[0]
if current is None or current.key != key:
return False
for i in range(self.level):
if update[i].forward[i] is current:
update[i].forward[i] = current.forward[i]
while (
self.level > 1
and self.head.forward[self.level - 1] is None
):
self.level -= 1
return True
python
skip = SkipList()
for value in [50, 10, 30, 20, 40]:
skip.insert(value)
print(skip.search(30))
print(skip.search(35))
skip.delete(30)
print(skip.search(30))