昨天面試,考查了跳錶,事後實現了一下
struct Node {
int val;
Node *right, *down;
Node(int val): val(val), right(NULL), down(NULL) {}
Node(int val, Node* right, Node* down): val(val), right(right), down(down) {}
};
class Skiplist {
Node* head;
public:
Skiplist() { head = new Node(INT_MIN); }
bool search(int target) {
auto p = head;
while(p) {
if(p->right && p->right->val < target) p = p->right;
else if(!p->right || p->right->val > target) p = p->down;
else return true;
}
return false;
}
void add(int num) {
auto p = head;
vector<Node*> v;
while(p) {
if(p->right && p->right->val < num) p = p->right;
else v.push_back(p), p = p->down;
}
bool add = true;
Node* down = NULL;
while(v.size() && add) {
auto p = v.back(); v.pop_back();
p->right = new Node(num, p->right, down); down = p->right;
add = rand()&1;
}
if(add) head = new Node(INT_MIN, new Node(num, NULL, down), head);
}
bool erase(int num) {
auto p = head;
bool deleted = false;
while(p) {
if(p->right && p->right->val < num) p = p->right;
else if(!p->right || p->right->val > num) p = p->down;
else {
deleted = true;
auto r = p->right;
p->right = r->right;
delete r;
p = p->down;
}
}
return deleted;
}
};