62,628
社区成员
发帖
与我相关
我的任务
分享
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();
}
}
循环里加一个0的判断条件,不然一直死循环。
[code=java]
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Test10 lru = new Test10(sc.nextInt());
while (sc.hasNextLine()){
String str = sc.nextLine();
if(str.equals("0")) break;
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();
}