leetcode146. LRU Cache

class LRUCache {
    	private class Node{
    		private int key;
    		private int value;
    		private	Node pre;
    		private Node next;
    		public Node(int key,int value){
    			this.key=key;
    			this.value=value;
    			this.pre=null;
    			this.next=null;
    		}
    	}
    	private Node dummy;
    	private Node tail;//表头最新,表尾最老
    	private int size;//链表中已有元素个数--不算头结点
    	private int capacity;
    	private Map<Integer,Node> map;//通过key,定位Node
        public LRUCache(int capacity) {
        	if(capacity<=0){
        		throw new IllegalArgumentException();
        	}
        	this.capacity=capacity;
        	this.size=0;
        	this.dummy=new Node(-1, 0);//虚拟头
        	this.tail=dummy;
        	this.map=new HashMap<Integer,Node>();
        }
        public int get(int key) {
            if(map.containsKey(key)){
            	moveToHead(map.get(key));
            	return map.get(key).value;
            }else{
            	return -1;
            }
        }
        //update || insert
        public void put(int key, int value) {
        	if(map.containsKey(key)){//update
        		map.get(key).value=value;
        		moveToHead(map.get(key));
        	}else{//insert
        		if(size==capacity){//已满,移除最老元素
                    map.remove(tail.key);//删除映射
        			tail=tail.pre;
        			tail.next=null;
        		}else{
        			size++;
        		}
    			Node node=new Node(key,value);
    			map.put(key, node);//添加一个映射
    			addToHead(node);
        	}
        }
        /**
         * 把链表中已经存在的一个结点移动到表头
         */
        private void moveToHead(Node node){
        	if(dummy.next==node){//本省就是第一个有效结点,相当于没有移动
        		return;
        	}
        	node.pre.next=node.next;
        	if(node==tail){//是最后一个结点,没有下一个结点但要更新尾指针
        		tail=node.pre;
        	}else{
        		node.next.pre=node.pre;
        	}
        	addToHead(node);
        }
        /**
         * 将一个结点插入到表头
         */
        private void addToHead(Node node){
        	if(dummy.next!=null){
        		dummy.next.pre=node;
        	}
        	node.next=dummy.next;
        	node.pre=dummy;
        	dummy.next=node;
        	if(tail==dummy){
        		tail=node;
        	}
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值