typedef struct zskiplistNode {
// 分值
double score;
// 成员对象
robj *obj;
// 后退指针
struct zskiplistNode *backward;
// 层
struct zskiplistLevel {
// 前进指针
struct zskiplistNode *forward;
// 跨度
unsigned int span;
} level[];
} zskiplistNode;
跳表的节点查找算法可以描述如下:
从跳表的头节点开始。
在当前层级上,从最右侧开始,逐个比较节点的值,直到找到一个节点的值大于或等于目标值。
如果当前节点的值等于目标值,则返回该节点,查找结束。
如果当前节点的值大于目标值,则向下移动到下一层级。
重复步骤2和3,直到找到目标节点或者到达跳表的底层。
跳表的插入算法描述如下:
随机生成层数。
插入新节点时,需要在每一层都更新对应的指针,使得新节点能够正确地插入到每一层中。