采用C++实现跳表,leetcode题解。
#include <iostream>
#include <vector>
static const int level = 10;
class SL{
public:
struct Node{
int val;
std::vector<Node*> next;
Node(int _val): val(_val){
next.resize(level, nullptr);
}
} * head;
SL(){
std::cout << "SL constructor\n";
head = new Node(-1);
}
~SL(){
delete head;
}
void find(int num, std::vector<Node*> &prev){
Node *p = head;
for(auto i = level - 1; i>=0; --i){
while(p->next[i] && p->next[i]->val < num){
p = p->next[i];
}
prev[i] = p;
}
}
bool search(int num){
std::vector<Node*> prev(level);
find(num, prev);
auto p = prev[0]->next[0];
return (p && p->val == num);
}
void add(int num){
std::vector<Node*> prev(level);
find(num, prev);
Node *p = new Node(num);
for(int i=0; i<level; ++i){
p->next[i] = prev[i]->next[i];
prev[i]->next[i] = p;
if(rand() %2){
break;
}
}
}
bool erase(int num){
std::vector<Node*> prev(level);
find(num, prev);
auto p = prev[0]->next[0];
if(!p || p->val != num){
return false;
}
for(auto i = 0; i< level && prev[i]->next[i] == p; ++i){
prev[i]->next[i] = p->next[i];
}
delete p;
return true;
}
};
int main(){
SL sl;
sl.add(5);
sl.add(7);
sl.add(9);
sl.add(8);
std::cout << "erase : " << sl.erase(7) << std::endl;
std::cout << "search res : " <<sl.search(5)<< std::endl;
}