跳錶c++

昨天面試,考查了跳錶,事後實現了一下

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章