简单的链表实现
class LRUCache {
private:
struct Node
{
Node *prev;
Node *next;
int key;
int value;
Node(int k,int v, Node* p = nullptr, Node *n = nullptr) :key(k),next(n), prev(p), value(v) {};
};
public:
LRUCache(int capacity) {
maxCapacity = capacity;
size = 0;
head = nullptr;
tail = nullptr;
}
int get(int key) {
auto i = mapTable.find(key);
if (i == mapTable.end())
return -1;
else
{
Node *node = (*i).second;
removeNode(node);
addNode(node);
return node->value;
}
}
void put(int key, int value) {
auto i = mapTable.find(key);
if (i == mapTable.end())
{
if (size == maxCapacity)
{
Node *tmp = tail;
removeNode(tail);
mapTable.erase(tmp->key);
delete tmp;
}
Node *node = new Node(key, value);
addNode(node);
mapTable[key] = node;
}
else
{
Node *node = (*i).second;
removeNode(node);
addNode(node);
node->value = value;
}
}
private:
void addNode(Node *node)
{
if (head == nullptr)
{
head = node;
head->prev = nullptr;
tail = node;
tail->next = nullptr;
}
else
{
head->prev = node;
node->next = head;
node->prev = nullptr;
head = head->prev;
}
++size;
}
void removeNode(Node *node)
{
if (node == head)
{
if (node->next == nullptr)
{
head = nullptr;
tail = nullptr;
}
else
{
head = head->next;
head->prev = nullptr;
}
}
else if (node == tail)
{
tail = tail->prev;
tail->next = nullptr;
}
else
{
node->prev->next = node->next;
node->next->prev = node->prev;
}
--size;
}
private:
int maxCapacity;
int size;
Node *head;
Node *tail;
map<int, Node*> mapTable;
};
LRUCache cache = new LRUCache( 2 );
cache.put(1, 1);
cache.put(2, 2);
cache.get(1);
cache.put(3, 3);
cache.get(2);
cache.put(4, 4);
cache.get(1);
cache.get(3);
cache.get(4);