首页 > 代码库 > Leetcode LRU Cache

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=http://www.mamicode.com/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 n40             npre.next=nnext;41             nnext.pre=npre;42             }43             //put n to head44             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=http://www.mamicode.com/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 }

 

Leetcode LRU Cache