Skiplist - Python

🧩 Syntax:
import random

class Node:
    def __init__(self, key, level):
        self.key = key
        # Initialize forward pointers to None for the given level
        self.forward = [None] * (level + 1)

class SkipList:
    def __init__(self, maxLevel):
        self.maxLevel = maxLevel
        self.level = 0  # Start with the lowest level
        self.header = Node(-1, maxLevel)  # Create a header node with a key of -1

    def randomLevel(self):
        lvl = 0
        # Randomly generate the level for the node
        while random.randint(0, 1) == 1 and lvl < self.maxLevel:
            lvl += 1
        return lvl

    def createNode(self, key, level):
        # A wrapper to create a new node
        return Node(key, level)

    def insertElement(self, key):
        update = [None] * (self.maxLevel + 1)
        current = self.header

        # Find the position to insert the new node
        for i in range(self.level, -1, -1):
            while current.forward[i] and current.forward[i].key < key:
                current = current.forward[i]
            update[i] = current

        current = current.forward[0]

        # Insert the node if it is not present
        if current is None or current.key != key:
            rlevel = self.randomLevel()

            if rlevel > self.level:
                for i in range(self.level + 1, rlevel + 1):
                    update[i] = self.header
                self.level = rlevel

            n = self.createNode(key, rlevel)

            for i in range(rlevel + 1):
                n.forward[i] = update[i].forward[i]
                update[i].forward[i] = n
            print(f"Successfully inserted key {key}")

    def searchElement(self, key):
        current = self.header
        # Search for the key
        for i in range(self.level, -1, -1):
            while current.forward[i] and current.forward[i].key < key:
                current = current.forward[i]
        current = current.forward[0]

        if current and current.key == key:
            print(f"Found key: {key}")
            return True
        print(f"Key not found: {key}")
        return False

    def deleteElement(self, key):
        update = [None] * (self.maxLevel + 1)
        current = self.header

        # Find the node to be deleted
        for i in range(self.level, -1, -1):
            while current.forward[i] 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:
            # Delete the node
            for i in range(self.level + 1):
                if update[i].forward[i] != current:
                    break
                update[i].forward[i] = current.forward[i]

            while self.level > 0 and self.header.forward[self.level] is None:
                self.level -= 1
            print(f"Successfully deleted key {key}")

    def displayList(self):
        print("\n*****Skip List*****")
        for i in range(self.level + 1):
            print(f"Level {i}: ", end="")
            node = self.header.forward[i]
            while node:
                print(node.key, end=" ")
                node = node.forward[i]
            print("")

# Example usage
if __name__ == "__main__":
    lst = SkipList(10)

    # Insert elements
    for key in [3, 6, 7, 9, 12, 19, 17]:
        lst.insertElement(key)

    lst.displayList()

    # Search for an element
    lst.searchElement(6)

    # Delete an element
    lst.deleteElement(6)

    # Display list after deletion
    lst.displayList()
SwayZ

SwayZ

Member