LeetCode LRU缓存机制

使用双向链表来表示最久未使用的结点,最久未使用的结点放在了尾部
使用哈希表来存放真正的数据
在这里插入图片描述

class LRUCache{
    class DLinkedNode{
        int key;
        int value;
        DLinkedNode pre;
        DLinkedNode next;
        public DLinkedNode(){}
        public DLinkedNode(int key,int value){
            this.key = key;
            this.value = value;
        }
    }
    int capacity; //容量
    int size;     //实际大小,当size超过capacity时,删除最久未使用的结点
    Map<Integer,DLinkedNode> cache = new HashMap<>();//哈希表用来存放真正的数据
    DLinkedNode head,tail;//添加首尾结点方便移动结点

    public LRUCache(int capacity){
	this.capacity = capacity;
	this.size = 0;
	head = new DLinkedNode();
	tail = new DLinkedNode();
	head.next = tail;
	tail.pre = head;
    }

    public int get(int key){
	DLinkedNode temp = map.get(key);
	if(key == null){
	    return -1;
	}
	moveToHead(temp);//将该结点移动到头部
	return temp.value;
    }
 
    public voide put(int key,int value){
	DLinkedNode temp = map.get(key);
	if(temp == null)
	{
	    DLinkedNode node = new DLinkedNode(key,value);
	    map.put(key,node);
	    addToHead(node);
	    ++size;
	    if(size > capacity)
	    {
	    	DLinkedNode removeNode = removeTail();
	    	map.remove(removeNode.key);
	    }
	}else{
	    temp.value = value;// 如果已经存在的话,就更新哈希表中的 key value  不需要更新双向链表 因为数据真正存储在了哈希表
	    moveToHead(temp);
	}
    }

    public move moveToHead(DLinkedNode node){
        node.pre.next = node.next;
        node.next.pre = node.pre;
        addToHead(node);
    }

    public DLinkedNode removeTail(){
        DLinkedNode res =  tail.pre;
        res.pre.next = tail;
        tail.pre = res.pre;
        return res;
    }

    public voi addToHead(DLinkedNode node){
        node.pre = head;
        node.next = head.next;
        head.next.pre = node;
        head.next = node;
    } 
}

猜你喜欢

转载自blog.csdn.net/qq_45260619/article/details/106329603