题解 | #设计LRU缓存结构#
设计LRU缓存结构
http://www.nowcoder.com/practice/e3769a5f49894d49b871c09cadd13a61
public class Solution {
Map<Integer,Node> cache = new HashMap<>();
public int capacity;
public int size;
public Node head;
public Node tail;
public int[] LRU (int[][] operators, int k){
capacity = k;
size = 0;
head = new Node();
tail = new Node();
head.next = tail;
tail.prev = head;
List<Integer> result = new ArrayList<>();
int len = operators.length;
if(len == 0)
return null;
for(int i=0;i<len;++i){
int[] temp = operators[i];
if(temp[0] == 1){
put(temp[1],temp[2]);
}else{
int val = get(temp[1]);
result.add(val);
}
}
int[] arr = result.stream().mapToInt(Integer::valueOf).toArray();
return arr;
}
class Node{
int key;
int value;
Node prev,next;
public Node(){}
public Node(int key,int value){
this.key = key;
this.value = value;
this.prev = this.next = null;
}
}
public int get(int key){
Node node = cache.get(key);
if(node == null){
return -1;
}else{
moveToHead(node);
return node.value;
}
}
public void put(int key,int value){
Node node = cache.get(key);
if(node == null){
Node newNode = new Node(key,value);
addToHead(newNode);
cache.put(key,newNode);
++size;
if(size > capacity){
Node node1 = deleteTail();
cache.remove(node1.key);
--size;
}
}else{
node.value = value;
moveToHead(node);
}
}
public void addToHead(Node node){
node.next = head.next;
head.next.prev = node;
node.prev = head;
head.next = node;
}
public void deleteNode(Node node){
node.next.prev = node.prev;
node.prev.next = node.next;
node.next = null;
node.prev = null;
}
public void moveToHead(Node node){
deleteNode(node);
addToHead(node);
}
// 删除最后一个节点
public Node deleteTail(){
Node node = tail.prev;
deleteNode(node);
return node;
}
查看14道真题和解析
