146.LRU缓存 使用双向链表和哈希表来实现LRU缓存

`

    class LRUCache{
	class LinkedNode{
	int key;
	int value;
        LinkedNode next;
        LinkedNode prev;
        public LinkedNode(){}
        public LinkedNode(int key, int value){
            this.key = key;
            this.value = value;
	}
	
	private Map<Integer, LinkedNode> map = new HashMap<>();
		private LinkedNode head;		//头节点
		private LinkedNode tail;		//尾节点
		private int size;				
		private int capacity;

		public LRUCache(int capacity) {
			this.size = 0;     				 //当前容量
			this.capacity = capacity;       //最大容量
			head = new LinkedNode();        //头节点
			tail = new LinkedNode();        //尾节点
			head.next = tail;
			tail.prev = head;
		}

		public int get(int key) {
			LinkedNode linkedNode = map.get(key);
			if (linkedNode == null) {
				return -1;
			}
			moveToFirst(linkedNode);
			return linkedNode.value;
		}

		public void put(int key, int value) {
			LinkedNode node = new LinkedNode(key, value);
			LinkedNode node1 = map.get(key);
			if(node1 != null){
				remove(node1);
				putFirst(node);
			}
			if(size < capacity){
				map.put(key, new LinkedNode(key, value));
				putFirst(new LinkedNode(key, value));
				size++;
			}else {
				map.put(key, new LinkedNode(key, value));
				LinkedNode last = tail.prev;
				map.remove(last.key);
				removeLast();
				putFirst(new LinkedNode(key, value));
			}
		}

		// 在首部加节点
		public void putFirst(LinkedNode node){
			LinkedNode temp = head.next;
			head.next = node;
			node.prev = head;
			node.next = temp;
			temp.prev = node;
		}

		//删除节点
		public void remove(LinkedNode node){
			LinkedNode prev = node.prev;
			LinkedNode next = node.next;
			prev.next = next;
			next.prev = prev;
		}

		//移到最前
		public void moveToFirst(LinkedNode node){
			remove(node);
			putFirst(node);
		}
		
		//移除掉最后一个节点
		public void removeLast(){
			LinkedNode temp = tail.prev;
			LinkedNode prev = temp.prev;
			prev.next = tail;
			tail.prev = prev;
    }
}

`

posted @ 2025-12-25 09:34  acccccccccc  阅读(2)  评论(0)    收藏  举报