主要实现此算法:使用链表+hashMap实现
如有bug,望指正
import java.util.HashMap;
import java.util.LinkedList;
public class LRUCache {
// 链表节点
class Node {
Node pre;
Node next;
int key, val;
Node(int key, int val) {
this.key = key;
this.val = val;
}
}
// 设置容量
private int cap;
// 当前链表长度
private int size;
private Node head;
private Node tail;
private HashMap<Integer, Node> mp = new HashMap<Integer, Node>();
public LRUCache(int cap) {
this.cap = cap;
this.size = 0;
}
public void set(int key, int val) {
Node node = mp.get(key);
if (node != null) {
node.val = val;
if (node == tail) {
return;
}
if (node == head){
head = head.next;
} else {
node.pre.next = node.next;
}
node.pre = tail;//注意要修改前驱
node.next = null;
tail.next = node;
tail = node;
return;
}
if (cap != 0 && cap == size) {
mp.put(head.key, null);
if (cap == 1) {
head = tail = null;
} else {
head = head.next;
}
size--;
}
node = new Node(key, val);
mp.put(key, node);
if (head == null) {
head = node;
tail = head;
head.pre = null;
head.next = null;
} else {
node.pre = tail;
node.next = null;
tail.next = node;
tail = node;
}
size++;
}
public int get(int key) {
Node node = mp.get(key);
if (node == null) {
return -1;
}
if (node == tail) {
return node.val;
}
if (node == head) {
node.next.pre = null;
head = node.next;
node.next = null;
tail.next = node;
node.pre = tail;
tail = node;
return node.val;
}
// 此时,node.pre不可能为空
node.pre.next = node.next;
node.pre = tail;
node.next = null;
tail.next = node;
tail = node;
return node.val;
}
public void printList() {
Node h = head;
while (h != null) {
System.out.print(h.key + ":" + h.val + "->");
h = h.next;
}
System.out.println();
}
public static void main(String[] args) {
LRUCache lru = new LRUCache(5);
lru.set(1, 11);
lru.printList();
lru.set(1, 13);
lru.printList();
lru.set(2, 23);
lru.printList();
lru.set(2, 22);
lru.printList();
lru.set(1,14);
lru.printList();
lru.set(3, 33);
lru.printList();
lru.set(4, 44);
lru.printList();
lru.set(5, 55);
lru.printList();
lru.set(6, 66);
lru.printList();
lru.set(5, 56);
lru.printList();
lru.set(7, 77);
lru.printList();
lru.set(4, 45);
lru.printList();
lru.set(8, 88);
lru.printList();
}
}