漫画算法笔记 哈希链表

漫画算法笔记

哈希链表

#include <iostream>
#include <stdlib.h>
#include <vector>
#include <string>
#include <map>
using namespace std;

struct Node
{
	Node(string key, string value)
		:_key(key), _value(value) {};
	Node * _pre = nullptr;
	Node * _next = nullptr;
	string _key;
	string _value;
};

//哈希链表
class LRUCache
{
public:
	LRUCache(int limit)
	{
		_limit = limit;
	}
	~LRUCache()
	{
		Node *node = _head;
		while (node->_next == nullptr)
		{
			Node *next = node->_next;
			delete node;
			node = next;
		}
		if(node)
			delete node;
	}
	string get(string key)
	{
		auto iter = _map.find(key);
		if (iter == _map.end())
		{
			return "";
		}
		string value = iter->second->_value;
		refreshNode(iter->second);
		return value;
	}
	void put(string key, string value)
	{
		auto iter = _map.find(key);
		if(iter == _map.end())
		{
			if ((int)_map.size() >= _limit )
			{
				//删除最不常用节点head
				Node *delNode = _head;
				string oldKey = removeNode(_head);
				//从链表中移除
				delete delNode;
				_map.erase(oldKey);
			}
			Node *node = new Node(key, value);
			addNode(node);
			_map.insert(make_pair(key, node));
		}
		else
		{
			iter->second->_value = value;
			refreshNode(iter->second);
		}
	}
	//刷新被访问的节点的位置
	void refreshNode(Node *node)
	{
		if (_end == nullptr)
		{
			return;
		}
		//移除节点
		removeNode(node);
		//重新加入节点
		addNode(node);
	}
	//表面移除(调整位置)
	string removeNode(Node *node)
	{
		if (node == _head && node == _end) 
		{
			//移除唯一节点
			_head = nullptr;
			_end = nullptr;
		}
		else if (node == _end)
		{
			//移除尾节点
			_end = _end->_pre;
			_end->_next = nullptr;
		}
		else if (node == _head)
		{
			//移除头结点
			_head = _head->_next;
			_head->_pre = nullptr;
		}
		else
		{
			//移除中间节点
			node->_pre->_next = node->_next;
			node->_next->_pre = node->_pre;
		}
		return node->_key;
	}
	void addNode(Node *node)
	{
		if ( _end != nullptr )
		{
			_end->_next = node;
			node->_pre = _end;
			node->_next = nullptr;
		}
		_end = node;
		if (_head == nullptr )
		{
			_head = node;
		}
	}

private:
	Node *_head = nullptr;
	Node *_end = nullptr;
	int _limit;
	map<string, Node*> _map;
};

int main(int argc, char** argv)
{
	LRUCache lruCache(5);
	lruCache.put("001", "用户1信息");
	lruCache.put("002", "用户2信息");
	lruCache.put("003", "用户3信息");
	lruCache.put("004", "用户4信息");
	lruCache.put("005", "用户5信息");
	cout << lruCache.get("002") << endl;
	lruCache.put("004", "更新用户4信息");
	lruCache.put("006", "用户6信息");
	cout << lruCache.get("001") << endl;
	cout << lruCache.get("006") << endl;

	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值