0
点赞
收藏
分享

微信扫一扫

LRU算法-hash+双链表(C++实现)

class LRUCache {
public:

    struct Node{
        int key;
        int value;
        Node* left;
        Node* right;
        Node(int _key, int _value): key(_key),value(_value),left(NULL),right(NULL){}
    }*L, *R;
    int n;
    unordered_map<int, Node*> hash;
    void remove(Node* p)
    {
        p->left->right = p->right;
        p->right->left = p->left;
    }
    void insert(Node* p)//插在头部
    {
        p->left = L;
        p->right = L->right;
        L->right->left = p;
        L->right = p;
        /*L->right = p;顺序千万别乱
        L->right->left = p;*/
        return;
    }
    LRUCache(int capacity) {
        n = capacity;
        L = new Node(-1,-1);
        R = new Node(-1,-1);
        L->right = R;//注意头部和尾部
        R->left = L;
    }
    
    int get(int key) {
        if(hash.count(key) == 0) return -1;
        auto p = hash[key];
        remove(p);//删除当前位置
        insert(p);//放在头部
        return p->value;
    }
    
    void put(int key, int value) {
        if(hash.count(key) == 0)//如果不再当前lru cache中
        {
            if(hash.size() == n)//缓存满了
            {
                auto p = R->left;
                if(p == NULL)
                    return;
                remove(p);
                hash.erase(p->key);
                delete p;
            }
            //没有满,直接插入
            auto p = new Node(key,value);
            hash[key] = p;
            insert(p);
        }
        else //在当前lru缓存中
        {
            auto p = hash[key];
            p->value = value;
            remove(p);
            insert(p);
        }
    }
};
举报

相关推荐

0 条评论