From 5910e351460094b4546e6971643739ee6ef8c9e2 Mon Sep 17 00:00:00 2001 From: Adarsh <46349391+4d4r5h@users.noreply.github.com> Date: Mon, 10 Oct 2022 20:23:04 +0530 Subject: [PATCH] Create LRU_Cache.cpp Leetcode 146 --- LeetCode/LRU_Cache.cpp | 80 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 LeetCode/LRU_Cache.cpp diff --git a/LeetCode/LRU_Cache.cpp b/LeetCode/LRU_Cache.cpp new file mode 100644 index 0000000..3b75b63 --- /dev/null +++ b/LeetCode/LRU_Cache.cpp @@ -0,0 +1,80 @@ +struct Node { + int key, value; + Node *prev, *next; + Node(int key, int value) { + this->key=key; + this->value=value; + prev=next=nullptr; + } +}; + +class LRUCache { + Node *data[10001]; + int capacity; + Node *head, *tail; +public: + + LRUCache(int capacity) { + for(int i=0; i<10001; i++) + data[i]=nullptr; + this->capacity=capacity; + head=new Node(-1,-1); // dummy nodes + tail=new Node(-1,-1); + head->next=tail; + tail->prev=head; + } + + int get(int key) { + if(data[key]!=nullptr) + { + Node *temp=data[key]; + Node *node=new Node(temp->key,temp->value); + node->next=head->next; + head->next=node; + node->prev=head; + node->next->prev=node; + data[key]=node; + + temp->prev->next=temp->next; + temp->next->prev=temp->prev; + delete temp; + return node->value; + } + else + return -1; + } + + void put(int key, int value) { + if(data[key]!=nullptr) + { + Node *temp=data[key]; + Node *node=new Node(key,value); + node->next=head->next; + head->next=node; + node->prev=head; + node->next->prev=node; + data[key]=node; + + temp->prev->next=temp->next; + temp->next->prev=temp->prev; + delete temp; + return; + } + capacity--; + if(capacity<0) + { + Node *node=tail->prev; + node->prev->next=node->next; + node->next->prev=node->prev; + data[node->key]=nullptr; + delete node; + capacity=0; + } + Node *node=new Node(key,value); + node->next=head->next; + head->next=node; + node->prev=head; + node->next->prev=node; + data[key]=node; + } +};