最近学习redis,了解了一下跳表,整好看到leetcode上有这道题,试着做了一下,然而自己太菜了,看了大佬的视频,学习了一下思路,写了一个Java版本的。
import java.util.ArrayDeque;
import java.util.Deque;
public class Skiplist{
class Node{
int val = -1;
Node right;
Node down;
public Node(int val, Node right, Node down ){
this.val = val;
this.right = right;
this.down = down;
}
}
Node head;
public Skiplist() {
head = new Node(-1,null,null);
}
public boolean search(int target) {
Node node = this.head;
while (null!=node){
while (null!=node.right&&node.right.val<target){
node = node.right;
}
if (null!=node.right&&node.right.val==target){
return true;
}
node = node.down;
}
return false;
}
public void add(int num) {
Deque<Node> deque = new ArrayDeque<>();
Node node = this.head;
while (null!=node){
while (null!=node.right&&node.right.val<num){
node = node.right;
}
deque.addLast(node);
node = node.down;
}
boolean insert = true;
Node down = null;
while (insert&&!deque.isEmpty()){
node = deque.removeLast();
node.right = new Node(num,node.right,down);
down = node.right;
insert = (Math.random()>0.5);
}
if (insert){
head = new Node(-1,null,head);
}
}
public boolean erase(int num) {
Node node = this.head;
boolean found = false;
while (null!=node){
while (null!=node.right&&node.right.val<num){
node = node.right;
}
if (null!=node.right&&node.right.val==num){
node.right = node.right.right;
found = true;
}
node = node.down;
}
return found;
}
}
这个思路比redis实现的跳表的思路简单很多,满足题目要求,但是有一个最大的问题,就是删除的时候如果最上层只剩head的话应该也要一同删除,这个没有。同时没有限高,有空的时候再回来优化一下。