[Leetcode] LRU Cache (Java)

来源:互联网 发布:mac地址一样 编辑:程序博客网 时间:2024/05/16 10:28

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.

实现LRU

用HashMap+LinkedList实现

public class LRUCache {    static class ListNode {int key;int value;ListNode next;ListNode pre;ListNode(int key,int value) {this.key = key;this.value = value;pre = null;next = null;}}private Map<Integer, ListNode> map;private int size;private int capacity;private ListNode head;private ListNode tail;public LRUCache(int capacity) {if(capacity<1)return;map = new HashMap<Integer, ListNode>();size = 0;this.capacity = capacity;head = new ListNode(-1,-1);tail = new ListNode(-1,-1);head.next = tail;tail.pre = head;}public int get(int key) {if(map.containsKey(key)){ListNode tmp = map.get(key);tmp.pre.next=tmp.next;tmp.next.pre=tmp.pre;head.next.pre=tmp;tmp.next=head.next;tmp.pre=head;head.next=tmp;return tmp.value;}return -1;}public void set(int key, int value) {if(map.containsKey(key)){ListNode tmp = map.get(key);tmp.pre.next=tmp.next;tmp.next.pre=tmp.pre;head.next.pre=tmp;tmp.next=head.next;tmp.pre=head;head.next=tmp;tmp.value=value;}else {if(size==capacity){map.remove(tail.pre.key);tail.pre.pre.next=tail;tail.pre=tail.pre.pre;ListNode tmp = new ListNode(key,value);map.put(key, tmp);head.next.pre=tmp;tmp.next=head.next;tmp.pre=head;head.next=tmp;}else if(size<capacity){ListNode tmp = new ListNode(key,value);map.put(key, tmp);head.next.pre=tmp;tmp.next=head.next;tmp.pre=head;head.next=tmp;size++;}}}}


0 0
原创粉丝点击