码迷,mamicode.com
首页 > 系统相关 > 详细

[LeetCode]LRU Cache

时间:2015-02-17 09:13:46      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:双链表   java   leetcode   

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.



public class LRUCache {
	class Node{
		int key;
		int val;
		Node pre;
		Node next;
		Node(int key,int val){
			this.key = key;
			this.val = val;
		}
	}
	
	Node head = new Node(-1,-1);
	Node tail = new Node(-1,-1);
	private void moveToTail(Node no){
		this.removeNode(no);
		no.pre = tail.pre;
		no.next = tail;
		tail.pre.next = no;
		tail.pre = no;
	}
	
	private void addNode(Node no){
		no.pre = tail.pre;
		no.next = tail;
		tail.pre.next = no;
		tail.pre = no;
	}
	
	private void removeNode(Node no){
		no.pre.next = no.next;
		no.next.pre = no.pre;
	}
	
	private Node getHead(){
		return head.next;
	}
	Map<Integer,Node> map = new HashMap<>();
    int cap;
    int count = 0;
    public LRUCache(int capacity) {
        cap = capacity;
        head.next = tail;
        tail.pre = head;
    }
    
    public int get(int key) {
    	Node res = map.get(key);
        if(res == null) {
        	return -1;
        }else{
        	int val = res.val;
        	this.moveToTail(res);
        	return val;
        }
    }
    
    public void set(int key, int value) {
    	if(map.containsKey(key)){
    		Node res = map.get(key);
    		res.val = value;
    		this.moveToTail(res);
    	}else{
    		count++;
    		if(count>cap){
    			Node rem = this.getHead();
    			map.remove(rem.key);
    			rem.key = key;
    			rem.val = value;
    			this.moveToTail(rem);
    			map.put(key, rem);
    		}else{
    			Node nod = new Node(key,value);
				this.addNode(nod);
				map.put(key, nod);
    		}
    	}
    }
}



[LeetCode]LRU Cache

标签:双链表   java   leetcode   

原文地址:http://blog.csdn.net/guorudi/article/details/43857323

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!