esign 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.
struct dlist {
int key, val;
dlist *next;
dlist(int k, int v) : key(k), val(v), next(NULL) {}
};
class LRUCache{
public:
LRUCache(int capacity) {
total = capacity;
curnum = 0;
head = NULL;
}
int get(int key) {
dlist *pfast = head, *pslow = head;
while (pfast) {
if (pfast->key != key) {
pslow = pfast;
pfast = pfast->next;
}
else
break;
}
if (pfast == NULL)
return -1;
else {
if (pfast != pslow) {
pslow->next = pfast->next;
pfast->next = head;
head = pfast;
}
return pfast->val;
}
}
void set(int key, int value) {
dlist *ptemp = new dlist(key, value);
if (head == NULL){
head = ptemp;
curnum++;
return;
}
else {
ptemp->next = head;
head = ptemp;
curnum++;
dlist *pslow = ptemp;
while (ptemp->next != NULL && ptemp->next->key != key) {
pslow = ptemp;
ptemp = ptemp->next;
}
if (ptemp->next != NULL) {
dlist *todel = ptemp->next;
ptemp->next = todel->next;
delete todel;
curnum--;
}
else {
if (curnum > total) {
pslow->next = NULL;
delete ptemp;
}
}
}
}
private:
int total;
int curnum;
dlist *head;
};