LeetCode 第1206题 设计跳表
思路来源:
LeetCode题解
class Solution {
private static final float FACTORY = 0.25f;
private static final int MAX_LEVEL = 32;
private Node head = new Node(Integer.MIN_VALUE, MAX_LEVEL);
private int level = 0;
public Solution() {
}
public void add(int num) {
int level = getLevel();
if(level-1 > this.level){
this.level = level-1;
}
Node node = new Node(num, level);
for(int i = 0; i < level; i++) {
Node temp = head;
Node beforeNode = head;
while (temp != null && temp.val < num){
beforeNode = temp;
temp = temp.next[i];
}
if(temp == null){
beforeNode.next[i] = node;
}else{
if(temp.val >= num){
beforeNode.next[i] = node;
node.next[i] = temp;
}
}
}
}
public boolean search(int target) {
Node temp = head;
Node beforeNode = head;
for(int i = level; i >= 0; i--){
while(temp != null && temp.val < target){
beforeNode = temp;
temp = temp.next[i];
}
if(temp == null){
if(i == 0){
return false;
}
temp = beforeNode.next[i-1];
continue;
}else{
if(temp.val == target){
return true;
}
if(temp.val > target){
if(i == 0){
return false;
}
temp = head;
}
}
}
return false;
}
public boolean erase(int num) {
boolean flag = false;
Node temp = head;
Node beforeNode = head;
for(int i = level; i >= 0; i--){
while(temp != null && temp.val < num){
beforeNode = temp;
temp = temp.next[i];
}
if(temp == null){
if(i == 0){
return false;
}
temp = beforeNode.next[i-1];
continue;
}
if(temp.val >= num){
if(temp.val == num){
beforeNode.next[i] = temp.next[i];
flag = true;
}
beforeNode = head;
temp = head;
continue;
}
}
return flag;
}
private int getLevel() {
int level = 1;
while(Math.random() < FACTORY && level < MAX_LEVEL) {
level++;
}
return level;
}
}
class Node{
int val;
Node[] next;
public Node(Integer val, int level) {
this.val = val;
this.next = new Node[level];
}
}
结果
虽然慢了点~~