lru

PHOTO EMBED

Tue Sep 13 2022 16:31:20 GMT+0000 (Coordinated Universal Time)

Saved by @Lokesh8126 #c++

class LRUCache
{
public:
	struct  Node
	{
		int key;
		int value;
		Node *prev;
		Node *next;
	};

	Node *head;
	Node *tail;
	int size , capacity;
	unordered_map<int , Node*>mapi;
	LRUCache(int capacity)
	{
		this->capacity = capacity;
		head = new Node();
		tail = new Node();
		head->next = tail;
		tail->prev = head;
		size =0;
	}

	Node* insertNode(int k , int v)
	{
		Node*newnode = new Node();
		newnode ->key = k;
		newnode->value=v;
		newnode->prev =head;
		newnode->next = head->next;
		newnode->next->prev = newnode;
		head->next = newnode;
		// // unordered_map<int , Node*>mapi
		// pair<int , int> p(k,v);
		mapi.erase(k);
		mapi[k] = newnode; 
		return newnode;
	}

	void pushtowardsHead(Node * newnode)
	{
		if(head->next == newnode)
			return;
		newnode->prev->next = newnode->next;
		newnode->next->prev = newnode->prev;
		newnode->prev =head;
		newnode->next = head->next;
		newnode->next->prev = newnode;
		head->next = newnode;
	}

	void removeTail()
	{
		Node*newnode = tail ->prev;
		tail->prev = newnode ->prev;
		newnode->prev->next= tail;
		mapi.erase(newnode->key);
	}

	int get(int k)
	{
		if(mapi.find(k) == mapi.end())
			return -1;
		Node* newnode =mapi[k];
		pushtowardsHead(newnode);
		return newnode->value;
	}

	void put(int k ,int v)
	{
		if(mapi.find(k)!=mapi.end())
		{//already present
			Node*newnode = mapi[k];
			newnode->value = v;
			pushtowardsHead(newnode);
			return;
		}

		insertNode(k,v);
		if(size <capacity)
		{
			size++;
			return;
		}
		else
		{
			removeTail();
		}
	}
};	
content_copyCOPY