Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit d875a86

Browse files
committed
add solution 146 [solution.java]
1 parent 596df87 commit d875a86

File tree

1 file changed

+88
-0
lines changed

1 file changed

+88
-0
lines changed

‎solution/146.Lru Cache/Solution.java‎

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
//双向链表的节点
2+
class Node{
3+
public int key;
4+
public int val;
5+
public Node pre;//指向前面的指针
6+
public Node next;//指向后面的指针
7+
public Node(int key,int value){
8+
this.val=value;
9+
this.key=key;
10+
}
11+
}
12+
class LRUCache {
13+
int capacity;//容量
14+
Node head;//双向链表的头,维护这个指针,因为set,get时需要在头部操作
15+
Node end;//双向链表的尾,set时,要是满了,需要将链表的最后一个节点remove
16+
HashMap<Integer,Node> map=new HashMap<Integer,Node>();//hash表
17+
public LRUCache(int capacity) {
18+
this.capacity=capacity;
19+
}
20+
//添加,删除尾部,插入头部的操作
21+
public void remove(Node node){
22+
Node cur=node;
23+
Node pre=node.pre;
24+
Node post=node.next;
25+
if(pre==null){//说明cur是头部节点
26+
head=post;
27+
}
28+
else pre.next=post;//更新指针,删除
29+
if(post==null){//说明cur是最后的节点
30+
end=pre;
31+
}
32+
else post.pre=pre;
33+
}
34+
public void setHead(Node node){
35+
//直接插入
36+
node.next=head;
37+
node.pre=null;
38+
if(head!=null) head.pre=node;//防止第一次插入时为空
39+
head=node;
40+
if(end==null) end=node;
41+
}
42+
public int get(int key) {
43+
if(map.containsKey(key)){
44+
//需要把对应的节点调整到头部
45+
Node latest=map.get(key);
46+
remove(latest);
47+
setHead(latest);
48+
//返回value
49+
return latest.val;
50+
}
51+
else return -1;
52+
}
53+
54+
public void put(int key, int value) {
55+
if(map.containsKey(key)){//这个key原来存在
56+
//只需要把key对应的node提到最前面,更新value
57+
Node oldNode=map.get(key);
58+
oldNode.val=value;
59+
remove(oldNode);
60+
setHead(oldNode);
61+
}
62+
else{
63+
//这个key原来不存在,需要重新new出来
64+
Node newNode=new Node(key,value);
65+
//接下来要考虑容量
66+
if(map.size()<capacity){
67+
setHead(newNode);
68+
map.put(key,newNode);
69+
}
70+
else{
71+
//容量不够,需要先将map中,最不常使用的那个删除了删除
72+
map.remove(end.key);
73+
//接下来更新双向链表
74+
remove(end);
75+
setHead(newNode);
76+
//放入新的
77+
map.put(key,newNode);
78+
}
79+
}
80+
}
81+
}
82+
83+
/**
84+
* Your LRUCache object will be instantiated and called as such:
85+
* LRUCache obj = new LRUCache(capacity);
86+
* int param_1 = obj.get(key);
87+
* obj.put(key,value);
88+
*/

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /