题解 | #设计LRU缓存结构#

设计LRU缓存结构

http://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84

struct DoubleLinkedNode{
    int key; int value;
    DoubleLinkedNode* prev;
    DoubleLinkedNode* next;
    DoubleLinkedNode() : key(0), value(0), prev(nullptr), next(nullptr) {}
    DoubleLinkedNode(int _key, int _value) : key(_key), value(_value), prev(nullptr), next(nullptr) {}
};

class Solution {
//双向链表 + 哈希表
private:
    unordered_map<int, DoubleLinkedNode*> cache;
    DoubleLinkedNode* head;
    DoubleLinkedNode* tail;
    int size;
    int capacity;
public:
    Solution(int _capacity) : capacity(_capacity), size(0) { //初始化列表
         // write code here       
        head = new DoubleLinkedNode();
        tail = new DoubleLinkedNode();
        head->next = tail;
        tail->prev = head;
    }
    
    int get(int key) {
         // write code here
        if(!cache.count(key)){
            return -1;
        }
        //找到其在哈希表中位置,移到头部
        DoubleLinkedNode* node = cache[key];
        removeToHead(node);
        return node->value;
    }
    
    void set(int key, int value){
         // write code here
        if(/*cache.find(key) == cache.end()*/!cache.count(key)){
            //不存在,新建
            DoubleLinkedNode* node = new DoubleLinkedNode(key, value);
            //存入哈希表
            cache[key] = node;
            //添加到头部
            addToHead(node);
            //更新size
            ++size;
            if(size > capacity){
                //如果超出容量 删除双向链表的最后一个节点
                DoubleLinkedNode* removed = removeTail();
                //删除哈希表中对应的项
                cache.erase(removed->key);
                //防止内存泄漏
                delete removed;
                --size;
            }
        }
        else{
            //存在 找到其在哈希表中位置,更新值,移到头部
            DoubleLinkedNode* node = cache[key];
            node->value = value;
            removeToHead(node);
        }
    }
    
    void addToHead(DoubleLinkedNode* Node){
        Node->prev = head;
        Node->next = head->next;
        head->next->prev = Node;
        head->next = Node;
    }
    
    void removeNode(DoubleLinkedNode* Node){
        Node->prev->next = Node->next;
        Node->next->prev = Node->prev;      
    }
    
    void removeToHead(DoubleLinkedNode* Node){
        removeNode(Node);
        addToHead(Node);
    }
    
    DoubleLinkedNode* removeTail(){
        DoubleLinkedNode* node = tail->prev;
        removeNode(node);
        return node;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* solution = new Solution(capacity);
 * int output = solution->get(key);
 * solution->set(key,value);
 */
华为题库题解 文章被收录于专栏

牛客华为题库的题解

全部评论

相关推荐

04-06 11:24
已编辑
太原学院 C++
真烦好烦真烦:感觉不太对劲,这种主动加微信的一般都是坑,要小心辨别
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务