lc_top_0923

lc146 LRU缓存

class LRUCache {
    class Node {
        int key;
        int value;
        Node prev;
        Node next;
        public Node(){
        }
        public Node(int key, int value){
            this.key = key;
            this.value = value;
        }
    }
    private int capacity;
    private int size;
    private HashMap<Integer, Node> map;
    private Node head;
    private Node tail;

    public LRUCache(int capacity) {
        this.capacity = capacity;
        this.size = 0;
        this.map = new HashMap<>();
        head = new Node();
        tail = new Node();
        head.next = tail;
        tail.prev = head;
    }

    public int get(int key) {
        if (map.containsKey(key)) {
            Node node = map.get(key);
            moveToHead(node);
            return node.value;
        }
        return -1;
    }



    public void put(int key, int value) {
        if (map.containsKey(key)) {
            Node node = map.get(key);
            node.value = value;
            moveToHead(node);
        } else{
            Node node = new Node(key, value);
            map.put(key, node);
            addToHead(node);
            checkSize();
        }

    }



    private void checkSize() {
        size++;
        if (size > capacity) {
            map.remove(tail.prev.key);
            removeNode(tail.prev);
            size--;
        }
    }
    private void addToHead(Node node) {
        node.next = head.next;
        node.prev = head;
        head.next.prev = node;
        head.next = node;
    }
    private void removeNode(Node node) {
        node.prev.next = node.next;
        node.next.prev = node.prev;
    }
    private void moveToHead(Node node) {
        removeNode(node);
        addToHead(node);
    }
}

基本链表操作,配合hash表

数据结构题:1.链表删除O(1)复杂度,双向链表,单链表使用替死鬼(删除后继节点)

posted @ 2022-09-23 21:57  北de窗  阅读(24)  评论(0)    收藏  举报