最近最少使用算法LRU

#include <iostream>
#include <unordered_map>

using namespace std;

// 双向链表节点
struct DLinkedNode {
	int key, val;
	DLinkedNode* pre;
	DLinkedNode* next;
	DLinkedNode() : key(0), val(0), pre(nullptr), next(nullptr) {}
	DLinkedNode(int _key,int _val) : key(_key), val(_val), pre(nullptr), next(nullptr) {}
};

class LRUCache {
    unordered_map<int, DLinkedNode*> cache;
    DLinkedNode* head;
    DLinkedNode* tail;
    int size;
    int capacity;

public:
    LRUCache(int capacity):capacity(capacity),size(0){
        head = new DLinkedNode();
        tail = new DLinkedNode();
        head->next = tail;
        tail->pre = head;
    }

    // 读取
    int get(int key) {
        if (!cache.count(key)) {
            return -1;
        }
        // 如果存在,先通过hash表定位,在移到头部
        DLinkedNode* node = cache[key];
        moveToHead(node);
        return node->val;

    }

    void moveToHead(DLinkedNode* node) {
        // 删除点
        remodeNode(node);
        // 添加点
        addTohead(node);
    
    }
    void remodeNode(DLinkedNode* node) {
        node->pre->next = node->next;
        node->next->pre = node->pre;
    }

    void addTohead(DLinkedNode* node) {
        node->pre = head;
        node->next = head->next;
        head->next->pre = node;
        head->next = node;
    }

    DLinkedNode* removeTail() {
        DLinkedNode* node = tail->pre;
        remodeNode(node);
        return node;
    }
    // 插入
    void put(int key, int value) {
        if (!cache.count(key)) {
            // 如果不存在
            DLinkedNode* node = new DLinkedNode(key, value);
            cache[key] = node;
            addTohead(node);
            ++size;
            if (size > capacity) {
                //  去尾巴,超出容量
                DLinkedNode* remove = removeTail();
                // 在map中删除对应的元素
                cache.erase(remove->key);
                delete remove;
                --size;
            }
            else {
                // 如果存在key,先定位,在修改val,再移动到头部
                DLinkedNode* node = cache[key];
                node->val = value;
                moveToHead(node);
            }


        }

    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值