typedef struct Node {
int key;
int value;
struct Node* prev;
struct Node* next;
UT_hash_handle hh;
} Node;
typedef struct {
int cap;
Node* leftMost;
Node* rightMost;
} LRUCache;
Node* hashedNodes = NULL;
void removeNode(Node* node)
{
node->prev->next = node->next;
node->next->prev = node->prev;
}
void insertNode(Node* node, LRUCache* cache)
{
Node* prev = cache->rightMost->prev;
Node* next = cache->rightMost;
prev->next = node;
next->prev = node;
node->next = next;
node->prev = prev;
}
LRUCache* lRUCacheCreate(int capacity) {
LRUCache* cache = (LRUCache*)malloc(sizeof(LRUCache));
cache->cap = capacity;
cache->leftMost = (Node*)malloc(sizeof(Node));
cache->rightMost = (Node*)malloc(sizeof(Node));
cache->leftMost->prev = NULL;
cache->leftMost->next = cache->rightMost;
cache->rightMost->prev = cache->leftMost;
cache->rightMost->next = NULL;
return cache;
}
int lRUCacheGet(LRUCache* obj, int key) {
Node* node;
HASH_FIND_INT(hashedNodes, &key, node);
if(node)
{
removeNode(node);
insertNode(node, obj);
return node->value;
}
return -1;
}
void lRUCachePut(LRUCache* obj, int key, int value) {
Node* node;
HASH_FIND_INT(hashedNodes, &key, node);
if(node)
{
removeNode(node);
node->value = value;
}
else
{
node = (Node*)malloc(sizeof(Node));
node->key = key;
node->value = value;
HASH_ADD_INT(hashedNodes, key, node);
}
insertNode(node, obj);
if(HASH_COUNT(hashedNodes) > obj->cap)
{
Node* LRUNode = obj->leftMost->next;
removeNode(LRUNode);
HASH_DEL(hashedNodes, LRUNode);
free(LRUNode);
}
}
void lRUCacheFree(LRUCache* obj) {
free(obj->leftMost);
free(obj->rightMost);
free(obj);
Node *currentNode, *tmp;
HASH_ITER(hh, hashedNodes, currentNode, tmp) {
HASH_DEL(hashedNodes, currentNode);
free(currentNode);
}
}
* Your LRUCache struct will be instantiated and called as such:
* LRUCache* obj = lRUCacheCreate(capacity);
* int param_1 = lRUCacheGet(obj, key);
* lRUCachePut(obj, key, value);
* lRUCacheFree(obj);
*/