核心API:
__find_pre_node(target)
:找到某个值的前置点,查询时与插入相反,是从上往下走迭代的。insert(data)
:根据插入到前置点之后,随机晋升。晋升时要往前回溯到上一个可向上的节点,向上走并构建上下通道search(target)
:基于__find_pre_node
实现查询节点。remove(target)
:删除节点,当节点有晋升时,要往上递归删除;当要删除的节点为当前层最后一个时,要移除层。__add_level()
/__sub_level(level_head)
:增加/减少层数,要注意node为最后一层时,不可把层数减为负。
一篇讲解: https://mp.weixin.qq.com/s/-1_jchMgIVeUdDhlTQCnnA,原文中的代码实现存在bug,配合下面的python代码理解更方便一些。
基本节点的数据结构:
class Node:
def __init__(self, value):
self.pre = self.next = None
self.down = self.up = None
self.v = value
跳表的python实现:
class SkipList:
def __init__(self, promote_rate=0.5):
self.max_level = 0
self.head, self.tail = Node(-float('inf')), Node(float('inf'))
self.promote_rate = promote_rate # 随机晋升概率
self.head.next, self.tail.pre = self.tail, self.head
def