LRU Cache

来源:互联网 发布:凸包算法 python 编辑:程序博客网 时间:2024/05/17 07:53

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.

参考:http://www.programcreek.com/2013/03/leetcode-lru-cache-java/

使用内部类Node存储插入的数据,map存储key和Node的对应关系;

get和set是要将该节点放置在head处,解法中使用head和end两个指针帮助头结点的设置和末节点的删除

public class LRUCache {    class Node{        public Node pre;        public Node next;        public int value;        public int key;                public Node(int key, int value){            this.key = key;            this.value = value;        }    }        private int capacity;    private int size;    private HashMap<Integer, Node> map= new HashMap<Integer, Node>();    private Node head;    private Node end;        public LRUCache(int capacity) {        this.capacity = capacity;        size = 0;    }        public int get(int key) {        if(map.containsKey(key)){            Node lastest = map.get(key);            remove(lastest);            setHead(lastest);            return lastest.value;        }        else return -1;    }        public void set(int key, int value) {        if(map.containsKey(key)){            Node lastest = map.get(key);            remove(lastest);            setHead(lastest);            lastest.value = value;        }        else{            Node lastest = new Node(key, value);            if(size < capacity){                size++;            }            else{                map.remove(end.key);                end = end.pre;                if(end != null) end.next = null;            }            setHead(lastest);            map.put(key, lastest);        }    }        private void remove(Node cur){        Node pre = cur.pre;        Node next = cur.next;                if(pre != null){            pre.next = next;        }        else head = next;                if(next != null){            next.pre = pre;        }        else end = pre;    }        private void setHead(Node cur){        cur.next = head;        cur.pre = null;        if(head != null){            head.pre = cur;        }                head = cur;        if(end == null){            end = cur;        }    }}


0 0