LRU cache

struct Node
{
	int id;
	char val[100];
	Node *prev;
	Node *next;
};

class DoubleLinkedList
{
public:
	DoubleLinkedList()
	{
		head = tail = NULL;
		size = 0;
	}
	int Size()
	{
		return size;
	}
	void InsertHead(Node *newHead)
	{
		if(NULL == head && NULL == tail)
			head = tail = newHead;
		else
		{
			newHead->next = head;
			newHead->prev = NULL;
			head->prev = newHead;
			head = newHead;
		}
		++size;
	}
	void DeleteTail()
	{
		delete remove(tail);
	}
	void Visit(Node *node)
	{
		remove(node);
		InsertHead(node);
	}

private:
	Node *remove(Node *del)
	{
		if(size <= 0)
			return NULL;
		if(--size == 0)
			head = tail = NULL;
		else if(del == head)
		{
			head = head->next;
			head->prev = NULL;
		}
		else if(del == tail)
		{
			tail = tail->prev;
			tail->next = NULL;
		}
		else
		{
			del->prev->next = del->next;
			del->next->prev = del->prev;
		}
		return del;
	}
	Node *head;
	Node *tail;
	int size;
};

class LRUCache
{
public:
	LRUCache(int limit):LIMIT(limit){}
	void Insert(int id, char *v)
	{
		while(list.Size() >= LIMIT)
			list.DeleteTail();
		Node *temp = new Node();
		temp->id = id;
		strcpy(temp->val, v);
		list.InsertHead(temp);
		umap[id] = temp;
	}
	void Update(int id, char *v)
	{
		unordered_map<int, Node*>::iterator it = umap.find(id);
		if(it != umap.end())
		{
			strcpy(it->second->val, v);
			list.Visit(it->second);
		}
	}
	char *Search(int id)
	{
		unordered_map<int, Node*>::iterator it = umap.find(id);
		if(it != umap.end())
		{
			list.Visit(it->second);
			return it->second->val;
		}
		return NULL;
	}
private:
	const int LIMIT;
	DoubleLinkedList list;
	unordered_map<int, Node*> umap;
};

int main()
{
	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值