C++手撸哈希双链表:LRU缓存

struct Node {
	int key;
	int val;
	Node* prev;
	Node* next;
	Node(int key, int val) {
		this->key = key;
		this->val = val;
	}
};

//以Node为节点构造双链表
struct DoubleList {
	Node *head, *tail;
	int size;
	DoubleList() {
		head = new Node(0, 0);
		tail = new Node(0, 0);
		head->next = tail;
		tail->prev = head;
		this->size = 0;
	}

	//在尾部添加节点
	void addList(Node* x) {
		x->next = tail;
		x->prev = tail->prev;
		tail->prev->next = x;
		tail->prev = x;
		this->size++;
	}

	//删除节点
	void remove(Node* x) {
		x->prev->next = x->next;
		x->next->prev = x->prev;
		this->size--;
	}

	//删除双链表中的第一个节点,并返回该节点
	Node* removeFirst() {
		if (head->next == tail) {
			return NULL;
		}
		Node* first = head->next;
		remove(first);
		return first;
	}

	int size1() {
		return this->size;
	}
};

class LRUCache {
public:
	unordered_map<int, Node*> map;
	DoubleList cache;
	int cap;
	LRUCache(int cap) {
		this->cap = cap;
	}

	//将某个Key提为最近使用的
	void makeRecently(int key) {
		Node* x = map[key];
		cache.remove(x);
		cache.addList(x);
	}

	//添加最近使用的
	void addRecently(int key, int val) {
		Node* x = new Node(key, val);
		cache.addList(x);
		map[key] = x;
	}

	//删除某一个key
	void deleteKey(int key) {
		Node* x = map[key];
		cache.remove(x);
		map.erase(key);
	}

	//删除最久未使用的元素
	void deleteLeastRecently() {
		Node* deletedNode = cache.removeFirst();
		int deleteKey = deletedNode->key;
		map.erase(deleteKey);
	}

	int get(int key) {
		if (!map.count(key)) {
			return -1;
		}
		makeRecently(key);
		return map[key]->val;
	}

	void put(int key, int val) {
		if (map.count(key)) {
			map[key]->val = val;
            makeRecently(key);
		}
		else {
			if (cache.size1() >= this->cap) {
				deleteLeastRecently();
			}
            addRecently(key, val);
		}
	}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值