Leetcode LRU Cache

Design and implement a data structure for Least Recently Used (LRU) cache. It should support the following operations: get and set.

get(key) - Get the value (will always be positive) of the key if the key exists in the cache, otherwise return -1.
set(key, value) - Set or insert the value if the key is not already present. When the cache reached its capacity, it should invalidate the least recently used item before inserting a new item.

 

这一题主要是要考虑到数据结构,首先我们定义一个双向链表来保存各个节点,并维护一个连表头和链表尾。同时我们用HashMap来保存节点的索引信息,存储key与其相对应的结点的索引。

每当执行get和set方法时,我们都将该结点放于链表头。

将结点移动到表头需要考虑两种情况。

1.该结点已经存在于链表中,此时我们需要先删除该链表中的该结点,然后将该结点添加到表头。

2.该节点是新增结点,在链表中并没有,则直接添加到连表头。

 

在执行set(key,value)方法时也需要考虑到两种情况。

1.在未超过容量的情况下,直接new一个该结点,并把该结点放置于表头。

2.超过容量的情况下,则首先需要删除链表尾,再将新的结点放于表头。

 

 1 package LRU.Cache;
 2 
 3 import java.util.HashMap;
 4 import java.util.Map;
 5 
 6 public class LRUCache {
 7     Map <Integer,Node>map;
 8     Node head;
 9     Node tail;
10     int len;
11     int num;
12     class Node{
13         int key;
14         int value;
15         Node next;
16         Node pre;
17         public Node(int key,int value){
18             this.key=key;
19             this.value=value;
20             this.next=null;
21             this.pre=null;
22         }
23     }
24      public LRUCache(int capacity) {
25            map =new HashMap<Integer,Node>(capacity);
26            head=new Node(-1,-1);
27            tail=new Node(-1,-1);
28            head.next=tail;
29            tail.pre=head;
30            len=capacity;
31            num=0;
32         }
33         public void moveToHead(Node n){
34             if(n!=null){
35             if(map.containsKey(n.key)){
36             Node headNext=head.next;
37             Node npre=n.pre;
38             Node nnext=n.next;
39             //remove n
40             npre.next=nnext;
41             nnext.pre=npre;
42             }
43             //put n to head
44             Node headNext1=head.next;
45             n.next=headNext1;
46             headNext1.pre=n;
47             head.next=n;
48             n.pre=head;
49             }else return;
50         }
51         public int removeTail(){
52             Node tailPre=tail.pre;
53             Node prePre=tailPre.pre;
54             prePre.next=tail;
55             tail.pre=prePre;
56             return tailPre.key;
57         }
58         public int get(int key) {
59             if(map.containsKey(key)){
60                 Node obj=map.get(key);
61                 moveToHead(obj);
62                 return obj.value;
63             }else{
64                 return -1;
65             }
66         }
67         
68         public void set(int key, int value) {
69             if(map.containsKey(key)){
70                 Node obj=map.get(key);
71                 obj.value=value;
72                 moveToHead(obj);
73             }else{
74                 Node obj=new Node(key,value);
75                 if(num<len){
76                     moveToHead(obj);
77                     map.put(key, obj);
78                     num++;
79                 }else{
80                     int remove=removeTail();
81                     map.remove(remove);
82                     moveToHead(obj);
83                     map.put(key, obj);
84                 }
85             }
86         }
87 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。