package com.jackiesteed.leetcode; import java.util.*; /** * Created by jackie on 4/23/15. */ public class LRUCache { private int capacity; private Map<Integer, Ele> map = new HashMap<Integer, Ele>(); private Ele head = null; private Ele tail = null; public LRUCache(int capacity) { this.capacity = capacity; } public void set(int key, int value) { if(map.containsKey(key)){ Ele e = map.get(key); if(head != e){ unlink(e); add2Head(e); } e.value = value; return; } if(map.size() >= capacity){ Ele e = tail; map.remove(e.key); e.value = value; e.key = key; map.put(key, e); unlink(e); add2Head(e); return; } Ele e = new Ele(); e.key = key; e.value = value; e.pre = null; e.next = null; if(head == null || tail == null){ head = e; tail = e; }else{ add2Head(e); } map.put(key, e); } private void add2Head(Ele e){ e.pre = null; e.next = head; head.pre = e; head = e; } public int get(int key) { if (map.containsKey(key)) { Ele e = map.get(key); if(head != e){ unlink(e); add2Head(e); } return map.get(key).value; } return -1; } private void unlink(Ele e){ if(e.pre != null) e.pre.next = e.next; if(e.next != null) e.next.pre = e.pre; if(tail == e) tail = e.pre; if(tail == null) tail = head; } static class Ele { private int value; private int key; private Ele next; private Ele pre; } public void print(){ Ele e = head; while(true){ if(e == null) break; System.out.print("(" + e.key + "," + e.value + "),"); e = e.next; } System.out.println(""); } public static void main(String[] args) { LRUCache cache = new LRUCache(3); cache.set(1,1); cache.set(2, 2); cache.set(3,3); cache.set(4,4); cache.print(); cache.get(4); cache.get(3); cache.get(2); cache.get(1); cache.print(); } }