LRU 实现的四种方式
单链表
class LRUCache {
private:
struct Node {
int key;
int val;
Node *next;
Node(int key, int val) : key(key), val(val), next(nullptr) {
}
};
private:
int capacity;
Node *pHead;
public:
LRUCache(int capacity) {
this->capacity = capacity;
pHead = new Node(0, 0);
}
int get(int key) {
Node *pNode = pHead;
while (nullptr != pNode->next) {
if (key == pNode->next->key) {
auto tmp = pNode->next;
pNode->next = pNode->next->next;
tmp->next = pHead->next;
pHead->next = tmp;
return pHead->next->val;
}
pNode = pNode->next;
}
return -1;
}
void put(int key, int value) {
Node *pNode = pHead;
while (nullptr != pNode->next) {
if (key == pNode->next->key) {
pNode->next->val = value;
auto tmp = pNode->next;
pNode->next = pNode->next->next;
tmp->next = pHead->next;
pHead->next = tmp;
return;
}
pNode = pNode->next;
}
pNode = new Node(key, value);
pNode->next = pHead->next;
pHead->next = pNode;
pHead->key++;
if (pHead->key > capacity) {
pNode = pHead;
while (nullptr != pNode->next && nullptr != pNode->next->next) {
pNode = pNode->next;
}
auto last = pNode->next;
pNode->next = nullptr;
if (nullptr != last) {
delete last;
last == null