leetcode-146. LRU 缓存机制
题目:
代码:
#include <iostream>
#include <vector>
#include <map>
using namespace std;
struct DLinkedNode{
int key,value;
DLinkedNode *prev,*next;
};
unordered_map<int,DLinkedNode*>cache;
DLinkedNode* head,*tail;
int size;
int capacity;
LRUCache(int _capacity):capacity(_capacity),size(0) {
head = new DLinkedNode;
tail = new DLinkedNode;
head->next = tail;
tail->prev = head;
}
int get(int key) {
if(!cache.count(key)){
return -1;
}
DLinkedNode *node = cache[key];
moveToHead(node);
return node->value;
}
void put(int key, int value){
if(!cache.count(key)){
DLinkedNode *node = new DLinkedNode;
node->key = key;
node->value = value;
cache[key]=node;
addToHead(node);
size++;
if(size>capacity){
DLinkedNode *removed = removeTail();
cache.erase(removed->key);
delete removed;
size--;
}
}else{
DLinkedNode* node = cache[key];
node->value = value;
moveToHead(node);
}
}
void addToHead(DLinkedNode* node){
node->prev=head;
node->next=head->next;
head->next->prev=node;
head->next=node;
}
void removeNode(DLinkedNode* node){
node->prev->next=node->next;
node->next->prev=node->prev;
}
void moveToHead(DLinkedNode* node){
removeNode(node);
addToHead(node);
}
DLinkedNode* removeTail(){
DLinkedNode* node=tail->prev;
removeNode(node);
return node;
}
int main(){
return 0;
}