1 class LRUCache {
2 public class DlinkNode {
3 private int key;
4 private int val;
5 private DlinkNode right;
6 private DlinkNode left;
7
8 public DlinkNode() {
9 }
10
11 public DlinkNode(int key, int value) {
12 this.key = key;
13 this.val = value;
14 }
15 }
16
17 private Map<Integer, DlinkNode> map = new HashMap<>();
18 private DlinkNode head = new DlinkNode(-1, -1);
19 private DlinkNode tail = new DlinkNode(-1, -1);
20 private int capacity;
21
22 public LRUCache(int capacity) {
23 this.capacity = capacity;
24 head.right = tail;
25 tail.left = head;
26 }
27
28 public int get(int key) {
29 if (map.containsKey(key)) {
30 DlinkNode node = map.get(key);
31 updateNode(node); //!!!
32 return map.get(key).val;
33 } else {
34 return -1;
35 }
36 }
37
38 public void put(int key, int value) {
39 if (map.containsKey(key)) {
40 DlinkNode node = map.get(key);
41 node.val = value;
42 updateNode(node); // !!! 注意更新结点位置
43 } else {
44 if (map.size() == capacity) {
45 removeFromHead();
46 }
47 DlinkNode node = new DlinkNode(key, value);
48 addToTail(node);
49 }
50 }
51
52 public void removeFromHead() {
53 DlinkNode del = head.right;
54 map.remove(del.key);
55 head.right = del.right;
56 del.right.left = head;
57 del = null;
58 }
59
60 public void addToTail(DlinkNode node) {
61 map.put(node.key, node);
62 DlinkNode pre = tail.left;
63 pre.right = node;
64 node.left = pre;
65 node.right = tail;
66 tail.left = node; // !!! 忘记这一句,调了一下午
67 }
68
69 public void updateNode(DlinkNode node) {
70 DlinkNode left = node.left;
71 DlinkNode right = node.right;
72 left.right = right;
73 right.left = left;
74 addToTail(node);
75 }
76 }