注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
貌似最直接的方法还是用自己实现的LinkedList来做,需要注意的是能不能根据Node找到map的key值 --- 为了达到这一目的,我决定在Node 中同时存储key / value .
- import java.util.*;
- class ListNode {
- int key, val;
- ListNode prev, next;
- public ListNode(int k, int v) {
- key = k;
- val = v;
- }
- }
- public class LRUCache {
- static int size, maxSize;
- ListNode head, tail;
- HashMap<Integer, ListNode> map;
- // initialize LRUCache in constructor
- public LRUCache(int capacity) {
- size = 0;
- maxSize = capacity;
- map = new HashMap<>();
- head = new ListNode(0, 0);
- tail = new ListNode(0, 0);
- head.next = tail;
- tail.prev = head;
- }
-
- public int get(int key) {
- if (map.containsKey(key)) {
- ListNode node = map.get(key);
- moveToFirst(node);
- return node.val;
- } else {
- return -1;
- }
- }
-
- public void set(int key, int value) {
- if (maxSize == 0) {
- return;
- }
- if (map.containsKey(key)) {
- ListNode node = map.get(key);
- node.val = value;
- moveToFirst(node);
- } else {
- // this key doesn't exsit in the map's keySet;
-
- // if the cache is full, exclude the last one node;
- if (size == maxSize) {
- ListNode toBeDeleted = tail.prev;
- map.remove(toBeDeleted.key);
- tail.prev = tail.prev.prev;
- tail.prev.next = tail;
- size--;
- }
- ListNode oldNext = head.next;
- ListNode newNext = new ListNode(key, value);
- head.next = newNext;
- newNext.next = oldNext;
- oldNext.prev = newNext;
- newNext.prev = head;
- map.put(key, newNext);
- size++;
- }
- }
- private void moveToFirst(ListNode node) {
- // get the node out of list
- ListNode p = node.prev;
- ListNode n = node.next;
- p.next = n;
- n.prev = p;
- // put node at the head of list;
- head.next.prev = node;
- node.prev = head;
- node.next = head.next;
- head.next = node;
- }
- public static void main(String[] args) {
- LRUCache cache = new LRUCache(1);
- cache.set(2, 1);
- System.out.println(cache.get(2));
- cache.set(3, 2);
- System.out.println(cache.get(2));
- System.out.println(cache.get(3));
- }
- }
复制代码 |