Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get
and set
.
get(key)
- Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value)
- Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.
用链表实现的,没用使用map。感觉使用map有作弊的感觉。
#include <iostream>
#include <stack>
#include <vector>
#include <string>
#include <stdlib.h>
#include <sstream>
#include <algorithm>
#include <map>
using namespace std;
class LRUCache{
public:
struct LinkNode {
int key,val;
LinkNode *next;
LinkNode(int key,int value) : val(value) ,key(key), next(nullptr){}
};
int size,capacity;
LinkNode *head,*tail;
LRUCache(int capacity) {
this->capacity = capacity;
this->size = 0;
this->tail = this->head = nullptr;
}
int get(int key) {
if(head == nullptr)return -1;
LinkNode* p = head;
if(head->key == key){
tail->next = head;
tail = head;
head = tail->next;
tail->next = nullptr;
return tail->val;
}
while (p->next != nullptr) {
if(p->next->key == key){
tail->next = p->next;
tail = p->next;
p->next = tail->next;
tail->next = nullptr;
return tail->val;
}
p = p->next;
}
return -1;
}
void set(int key, int value) {
LinkNode* p = head;
if(p!=nullptr&&head->key == key){
tail->next = head;
tail = head;
tail->val = value;
head = tail->next;
tail->next = nullptr;
return;
}
while (p!=nullptr&&p->next != nullptr) {
if(p->next->key == key){
tail->next = p->next;
tail = p->next;
tail->val = value;
p->next = tail->next;
tail->next = nullptr;
return;
}
p = p->next;
}
LinkNode* newnode = new LinkNode(key,value);
if(size >= capacity)
head = head->next;
else
++size;
if(head == nullptr)
head = newnode;
else
tail->next = newnode;
tail = newnode;
return;
}
};
int main(){
auto cache = new LRUCache(2);
cache->set(1, 1);
cache->set(2,2);
cache->set(2,3);
cout<<cache->get(2)<<endl;
//system("pause");
}