Leetecode——面试题 16.25. LRU缓存

Posted dtwd886

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetecode——面试题 16.25. LRU缓存相关的知识,希望对你有一定的参考价值。

常考。最初建立头部尾部哑结点,两者相互指向。注意的是push时本身有key是应该对其进行更新,并将其移到头部。

不然再根据是否容量足够来判断是否需要删除尾部结点,然后将其放置到头部哑结点后面一位。

get时有对应结点需要将当前结点从结点位置移动到头部后一个结点。

class LRUCache 
private:
    int _capacity;
    int count_node=0;
    struct Node
    
        Node(int _key,int _val)
        
            key=_key;
            val=_val;
        
        int val;
        int key;
        Node* pre=nullptr;
        Node* next=nullptr;
    ;
    unordered_map<int,Node*>key_Node;
    Node* hair; 
    Node* tail;
public:
    LRUCache(int capacity) 
        _capacity=capacity;
        hair=new Node(-1,-1);
        tail=new Node(-2,-2);
        hair->next=tail;
        tail->pre=hair;
    
    
    int get(int key) 
        if(key_Node.find(key)!=key_Node.end())
        
            Node* temp=key_Node[key];
            removeNode(temp);
            addToHead(temp);
            return temp->val;
        
        return -1;
    
    
    void put(int key, int value) 
        if(key_Node.find(key)==key_Node.end())
        
            Node* temp=new Node(key,value);
            key_Node[key]=temp;
            if(count_node<_capacity)
            
                count_node++;
                addToHead(temp);
            
            else
            
                removeTail();
                addToHead(temp);
            
        
        else
        
            Node* temp=key_Node[key];
            temp->val=value;
            removeNode(temp);
            addToHead(temp);
        
    
    void removeNode(Node* node)
    
        node->pre->next=node->next;
        node->next->pre=node->pre;
    
    void addToHead(Node* node)
    
        node->next=hair->next;
        node->pre=hair;
        hair->next->pre=node;
        hair->next=node;
    
    void removeTail()
    
        Node* temp=tail->pre;
        cout<<temp->val<<endl;
        temp->pre->next=tail;
        tail->pre=temp->pre;
        key_Node.erase(temp->key);
        delete(temp);
    

;

 

以上是关于Leetecode——面试题 16.25. LRU缓存的主要内容,如果未能解决你的问题,请参考以下文章

最强解析面试题:Goland 实现LRU算法

LinkedHashMap实现LRU算法--高频面试题

面试题LRU算法及编码实现LRU策略缓存

JavaScript算法题实现-146-LRU缓存机制——腾讯面试题库

LeetCode上一道经典的面试题-O实现LRU Cache

Goland 实现LRU算法