Untitled

 avatar
unknown
plain_text
21 days ago
2.1 kB
10
Indexable
struct Node {
    int key, val;
    Node *next, *prev;
    Node(int key, int val) {
        this->key=key;
        this->val=val;
        this->next=NULL;
        this->prev=NULL;
    }
};

class LRUCache {
    int cap, totalNodes;
    unordered_map<int,Node*> nodeMap;
    Node *head, *tail;
    void moveHead() {
        head->next->prev=NULL;
        head=head->next;
    }
    void removeNode(Node *node) {
        node->prev->next=node->next;
        node->next->prev=node->prev;
    }
    void moveNodeToTail(Node *node) {
        tail->next=node;
        node->prev=tail;
        tail=node;
    }
public:
    LRUCache(int capacity) {
        this->cap=capacity;
        this->totalNodes=0;
    }
    int get(int key) {
        if(nodeMap.find(key)!=nodeMap.end()) {
            Node *node=nodeMap[key];
            if(tail==node)return node->val;
            else if(head==node)moveHead();
            else removeNode(node);
            moveNodeToTail(node);
            return node->val;
        }
        return -1;
    }
    
    void put(int key, int value) {
        if(nodeMap.find(key)!=nodeMap.end()){
            Node *node=nodeMap[key];
            node->val=value;
            if(tail==node)return;
            else if(head==node)moveHead();
            else removeNode(node);
            moveNodeToTail(node);
        }
        else {
            Node *node=new Node(key,value);
            nodeMap[key]=node;
            if(totalNodes==0){
                head=node;
                tail=node;
                totalNodes++;
                return;
            }
            moveNodeToTail(node);
            totalNodes++;
            if(cap<totalNodes){
                nodeMap.erase(head->key);
                moveHead();
                totalNodes=cap;
            }
        }
    }
};

/**
 * Your LRUCache object will be instantiated and called as such:
 * LRUCache* obj = new LRUCache(capacity);
 * int param_1 = obj->get(key);
 * obj->put(key,value);
 */
Editor is loading...
Leave a Comment