谁能帮我看看这个LRU算法哪错了,,我在牛客上面老是出问题
package cn.yangyt.lru;
import java.util.HashMap;
import java.util.Scanner;
public class Main {
private final HashMap<Integer, Node> map = new HashMap<>();
private final Node head = new Node();
private final Node tail = new Node();
private final int capacity;
private int size;
public Main(int capacity) {
head.next = tail;
tail.pre = head;
this.capacity = capacity;
size = 0;
}
static class Node {
private int key;
private int value;
private Node pre;
private Node next;
public Node() {
}
public Node(int key, int value) {
this.key = key;
this.value = value;
}
}
//双向链表头插法。
private void addNode(Node node) {
Node originHead = head.next;
head.next = node;
node.pre = head;
node.next = originHead;
originHead.pre = node;
}
//双向链表删除某个节点
private void remove(Node node) {
Node next = node.next;
Node pre = node.pre;
pre.next = next;
next.pre = pre;
node.pre = null;
node.next = null;
}
public void put(int key, int value) {
Node node = map.get(key);
if (node == null) {
if (size < capacity) {
size++;
} else {
//删除链表尾节点
Node pre = tail.pre;
map.remove(pre.key);
remove(pre);
}
Node node1 = new Node(key, value);
addNode(node1);
map.put(key, node1);
} else {
//将链表中key的value更换
node.value = value;
map.put(key,node);
// node.value = value;
// remove(node);
// addNode(node);
}
}
public int get(int key) {
Node node = map.get(key);
if (node == null) {
return -1;
}
remove(node);
addNode(node);
return node.value;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Main lru = new Main(sc.nextInt());
while (sc.hasNextLine()){
String str = sc.nextLine();
String[] c = str.split(" ");
String m = c[0];
if("p".equals(m)){
lru.put(Integer.parseInt(c[1]),Integer.parseInt(c[2]));
}else if ("g".equals(m)){
System.out.println(lru.get(Integer.parseInt(c[1])));
}
}
sc.close();
}
}
一直报
返回非零
请检查是否存在数组越界等非法访问情况
...全文
相关推荐
LRU算法 lru算法
LRU算法 1.cpp 1.exe LRU FIFO REPORTMENT
【牛客算法】某司面试算法题:设计LRU缓存结构
HashMap作为缓存记录的快速查找结构,使得get和set操作在 O(1) 时间完成。双向链表维护 LRU 顺序,头部表示最近使用,尾部表示最久未使用。容量管理:当超出容量时,通过删除尾节点(最久未使用),并从map中移除。
c语言实现的LRU算法
使用c语言是实现的LRU算法,带测试用例,供大家学习参考使用
lru算法C语言实现
C语言写的lru算法,验证过了,可以用。大概还是不错的
LRU算法 C++实现
操作系统中的一个算法 C++实现的,Lru算法


Java SE
