text: """
      An implementation of skip list.
      The list stores positive integers without duplicates.
  
      跳表的一种实现方法。
      跳表中储存的是正整数，并且储存的是不重复的。
  
      Author: Wenru
  """
  
  from typing import Optional
  import random
  
  class ListNode:
  
      def __init__(self, data: Optional[int] = None):
          self._data = data
          self._forwards = []   # Forward pointers
  
  class SkipList:
  
      _MAX_LEVEL = 16
  
      def __init__(self):
          self._level_count = 1
          self._head = ListNode()
          self._head._forwards = [None] * type(self)._MAX_LEVEL
  
      def find(self, value: int) -> Optional[ListNode]:
          p = self._head
          for i in range(self._level_count - 1, -1, -1):   # Move down a level
              while p._forwards[i] and p._forwards[i]._data < value:
                  p = p._forwards[i]   # Move along level
          
          return p._forwards[0] if p._forwards[0] and p._forwards[0]._data == value else None
  
      def insert(self, value: int):
          level = self._random_level()
          if self._level_count < level: self._level_count = level
          new_node = ListNode(value)
          new_node._forwards = [None] * level
          update = [self._head] * level     # update is like a list of prevs
  
          p = self._head
          for i in range(level - 1, -1, -1):
              while p._forwards[i] and p._forwards[i]._data < value:
                  p = p._forwards[i]
              
              update[i] = p     # Found a prev
  
          for i in range(level):
              new_node._forwards[i] = update[i]._forwards[i]   # new_node.next = prev.next
              update[i]._forwards[i] = new_node     # prev.next = new_node
          
      def delete(self, value):
          update = [None] * self._level_count
          p = self._head
          for i in range(self._level_count - 1, -1, -1):
              while p._forwards[i] and p._forwards[i]._data < value:
                  p = p._forwards[i]
              update[i] = p
          
          if p._forwards[0] and p._forwards[0]._data == value:
              for i in range(self._level_count - 1, -1, -1):
                  if update[i]._forwards[i] and update[i]._forwards[i]._data == value:
                      update[i]._forwards[i] = update[i]._forwards[i]._forwards[i]     # Similar to prev.next = prev.next.next
  
      def _random_level(self, p: float = 0.5) -> int:
          level = 1
          while random.random() < p and level < type(self)._MAX_LEVEL:
              level += 1
          return level
  
      def __repr__(self) -> str:
          values = []
          p = self._head
          while p._forwards[0]:
              values.append(str(p._forwards[0]._data))
              p = p._forwards[0]
          return "->".join(values)
  
  
  if __name__ == "__main__":
      l = SkipList()
      for i in range(10):
          l.insert(i)
      print(l)
      p = l.find(7)
      print(p._data)
      l.delete(3)
      print(l)