LRU Cache

问题描述

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 value;

		Node prev;

		Node next;



		public Node(int key, int value) {

			this.key = key;

			this.value = value;

		}

	}



	int capacity;

	Node head;

	Node tail;

	HashMap<Integer, Node> map;



	public LRUCache(int capacity) {

		this.capacity = capacity;

		this.head = new Node(-1, -1);

		this.tail = new Node(-1, -1);

		head.next = tail;

		tail.prev = head;

		this.map = new HashMap<Integer, Node>();

	}



	public int get(int key) {

		if (map.containsKey(key)) {

			Node node = map.get(key);

			node.prev.next = node.next;

			node.next.prev = node.prev;

			moveToTail(node);

			return node.value;

		}

		return -1;

	}



	private void moveToTail(Node node) {

		tail.prev.next = node;

		node.prev = tail.prev;

		node.next = tail;

		tail.prev = node;

	}



	public void set(int key, int value) {

		if (get(key) != -1) {

			map.get(key).value = value;

			return;

		}

		if (map.size() == capacity) {

			Node first = head.next;

			map.remove(first.key);

			head.next = first.next;

			first.next.prev=head;

		}

		Node node = new Node(key, value);

		map.put(key, node);

		moveToTail(node);

	}

}

  

你可能感兴趣的:(cache)