快手视频|用java实现跳表SkipList( 二 )


如果stack中都没有了还要升级 , 说明整个跳表网结构要升一层 , 只需要new一个头节点 , 把老的头节点设置到新头节点的down就行 , 在把new出来的node设置到新节点的right , 新的一层就完成了 。
通过利用findPredecessor和栈就很简单的实现了升级 , 所以添加过程还是比较简单的 。
跳表的删除实现直接上删除方法源码 , 源码如下图:
如果理解了添加方法中的升级方法 , 那么删除方法就比较简单了 , 还是利用findPredecessor找到前置节点 , 然后验证前置节点的右节点 , 如果右节点的值等于value就把右节点从链表中移除 。
同样由于在findPredecessor方法中填充了stack , 所以只要验证stack中的右节点然后进行移除就行 , 删除方法就完成了 。
跳表测试测试结果如下图:
通过实现print打印了跳表的网图 , 看打印的结构基本完成 , 算是成功了 , 从打印结果来看 , 比如我要查96只需要2次比较 , 即使要查的数据刚好是链表中的最后一个也没有几个 。
总结SkipList实现过程还是比较艰难 , 不过总算是写出来了 , 主要在于findPredecessor方法 , findPredecessor既能找到前置节点 , 实际上也找到了每一层的前置节点 , 然后不管是添加还是删除就比较简单了 。
Java程序员日常学习笔记 , 如理解有误欢迎各位交流讨论!
【快手视频|用java实现跳表SkipList】


推荐阅读