- 哈希表保存每个节点的地址
- 双向链表的结点保存数据
- 越靠近头结点,表示距离上次访问时间越短,尾部表示访问少
- 访问节点时候,如果结点存在,结点交换到链表头部,同时hash中更新该节点地址
- 插入节点时候,如果达到上限,删除尾部结点,同时在hash中删除对应的项,新节点插入链表头部
class LRUCache
{
public:
LRUCache(int capacity)
{
this->capacity = capacity;
}
int get(int key)
{
if (cacheMap.find(key) == cacheMap.end())
{
return -1;
}
cachlist.splice(cachlist.begin(), cachlist, cacheMap[key]);
cacheMap[key] = cachlist.begin();
return cacheMap[key]->value;
}
void put(int key, int value)
{
if (cacheMap.find(key) == cacheMap.end())
{
if (cacheMap.size() == this->capacity)
{
cacheMap.erase(cachlist.back().key);
cachlist.pop_back();
}
cachlist.push_front(CacheNode(key, value));
cacheMap[key] = cachlist.begin();
}
else
{
cacheMap[key]->value = value;
cachlist.splice(cachlist.begin(), cachlist, cacheMap[key]);
cacheMap[key] = cachlist.begin();
}
}
private:
struct CacheNode
{
int key;
int value;
CacheNode(int k, int v) :key(k), value(v) {};
};
private:
list<CacheNode> cachlist;
unordered_map<int, list<CacheNode>::iterator> cacheMap;
int capacity;
};