题解 | #设计LRU缓存结构#

设计LRU缓存结构

https://www.nowcoder.com/practice/5dfded165916435d9defb053c63f1e84

import java.util.*;


public class Solution {
// 容器
    private Map<Integer, Node> cache = new HashMap<>();
    private int size;
    private int capacity;
    private Node dummyHead, dummyTail;

    class Node {
        int key;
        int val;
        Node pre;
        Node next;

        Node() {}
        Node(int key, int val) {
            this.key = key;
            this.val = val;
        }

        Node(int key, int val, Node pre, Node next) {
            this.key = key;
            this.val = val;
            this.pre = pre;
            this.next = next;
        }
    }

    public Solution(int capacity) {
// write code here
        this.capacity = capacity;
        // 头尾相连
        dummyHead = new Node();
        dummyTail = new Node();
        dummyHead.next = dummyTail;
        dummyTail.pre = dummyHead;

        this.size = 0;
    }

    public int get(int key) {
        // write code here
        Node node = cache.get(key);
        if (null == node) return -1;
        moveToHead(node);
        return node.val;
    }

    public void set(int key, int value) {
        // write code here
        Node node = cache.get(key);
        if (null == node) {
            // 创建
            Node newNode = new Node(key, value);
            cache.put(key, newNode);
            addHead(newNode);
            this.size++;

            if (size > capacity) {
                Node tmp = removeTail();
                cache.remove(tmp.key);
                --this.size;
            }
        } else {
            // 更新键值和位置
            node.val = value;
            moveToHead(node);
        }
    }

    // 对链表的操作
    // 添加到头节点
    private void addHead(Node node) {
        node.pre = dummyHead;
        node.next = dummyHead.next;
        dummyHead.next.pre = node;
        dummyHead.next = node;
    }

    // 删除节点
    private void removeNode(Node node) {
        node.pre.next = node.next;
        node.next.pre = node.pre;
    }

    // 将当前节点移到头部
    private void moveToHead(Node node) {
        removeNode(node);
        addHead(node);
    }

    // 删除尾部节点,返回值使得键值表中删除
    private Node removeTail() {
        Node node = dummyTail.pre;
        removeNode(node);
        return node;
    }
}

/**
 * Your Solution object will be instantiated and called as such:
 * Solution solution = new Solution(capacity);
 * int output = solution.get(key);
 * solution.set(key,value);
 */

全部评论

相关推荐

风中翠竹:真的真的真的没有kpi。。。面试官是没有任何kpi的,捞是真的想试试看这个行不行,碰碰运气,或者是面试官比较闲现在,没事捞个人看看。kpi算HR那边,但是只有你入职了,kpi才作数,面试是没有的。
双非有机会进大厂吗
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
06-11 13:34
offe从四面八方来:我真的没时间陪你闹了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务