LRU Cache 데이터 구조

leecode 의 146 문제 LRU 데이터 구 조 는 매우 유용 한 데이터 구조 로 이 문 제 는 제 한 된 대기 열 을 지원 하 며 get 과 set 방법의 복잡 도 는 O (1) 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. cache reached its capacity, it should invalidate the least recently used item before inserting a new item. 핵심 요구 O (1), 핵심 사상: 쌍방 향 링크 + Hashmap,
  • import java.util.HashMap;
    public class LRUCache {
    
       int capacity;
        HashMap map = new HashMap();
        Node head=null;
        Node end=null;
    
        public LRUCache(int capacity) {
            this.capacity = capacity;
        }
    
        public int get(int key) {
            if(map.containsKey(key)){
                Node n = map.get(key);
                remove(n);
                setHead(n);
                return n.value;
            }
    
            return -1;
        }
    
        public void remove(Node n){
            if(n.pre!=null){
                n.pre.next = n.next;
            }else{
                head = n.next;
            }
    
            if(n.next!=null){
                n.next.pre = n.pre;
            }else{
                end = n.pre;
            }
    
        }
    
        public void setHead(Node n){
            n.next = head;
            n.pre = null;
    
            if(head!=null)
                head.pre = n;
    
            head = n;
    
            if(end ==null)
                end = head;
        }
    
        public void set(int key, int value) {
            if(map.containsKey(key)){
                Node old = map.get(key);
                old.value = value;
                remove(old);
                setHead(old);
            }else{
                Node created = new Node(key, value);
                if(map.size()>=capacity){
                    map.remove(end.key);
                    remove(end);
                    setHead(created);
    
                }else{
                    setHead(created);
                }    
    
                map.put(key, created);
            }
        }
    
        class Node{
            int key;
            int value;
            Node pre;
            Node next;
    
            public Node(int key, int value){
                this.key = key;
                this.value = value;
            }
        }
    }

    좋은 웹페이지 즐겨찾기