手撕LRU

作者: 言的希 | 来源:发表于2021-08-27 16:22 被阅读0次

import java.util.HashMap;

import java.util.Map;

public class lru {

    private class ListNode {  //双链表节点数据结构

        int key;

        int val;

        ListNode pre;

        ListNode next;

        public  ListNode(int key, int val) {

            this.key = key;

            this.val = val;

            pre =null;

            next =null;

        }

    }

    private int capacity;//链表容量

    private Mapmap; //查找数据在不在链表里面的hash表

    private ListNodehead;

    private ListNodetail;

    public lru(int capacity) { //初始化双链表数据结构

        this.capacity = capacity;

        map =new HashMap<>();

        head =new ListNode(-1, -1); //head与tail不是严格意义上的节点,只是一种数据结构

        tail =new ListNode(-1, -1);

        head.next =tail;

        tail.pre =head;

    }

    public int get(int key) {  //从map( hash表 )中找到key,并插到链表尾部

        if(!map.containsKey(key)) {

            return -1;

        }

        ListNode node =map.get(key);

        node.pre.next = node.next; //把找到的这个节点删除

        node.next.pre = node.pre; //把找到的这个节点删除

        moveToTail(node); //再接到尾部

        return node.val;

    }

private void moveToTail(ListNode node) {  //将node节点移到尾部

        node.pre =tail.pre;

        tail.pre = node;

        node.pre.next = node;

        node.next =tail;

   }

    public void put(int key, int value) { //LRU总思想

        //直接调用这边的get方法,如果存在,它会在get内部被移动到尾巴,不用再移动一遍,直接修改值即可

        if(get(key) != -1) {

            map.get(key).val = value;

            return;

        }

        //在hash表中不存在该数据,则new一个出来,如果超出容量,把头去掉

        ListNode node =new ListNode(key, value);

        map.put(key, node);

        moveToTail(node);

        if(map.size() >capacity) {

            map.remove(head.next.key);

            head.next =head.next.next;

            head.next.pre =head;

        }

    }

}

相关文章

  • 手撕LRU

    import java.util.HashMap;import java.util.Map;public clas...

  • LRU手撕实现

    国庆期间,因玩忘学,愧疚难当,一时冲动,手撕算法,以表歉意。谈起LRU,实则对其心仪已久,之前也对其实现原理进行过...

  • 手撕一个LRU Cache

    前言 今天时间紧张,借一道经典面试题简单聊两句吧。 LeetCode 146 - LRU Cache 最近最少使用...

  • 2021-08-01 手撕LRU

  • 想吃面包别出去买了,手把手教你做手撕包,香甜软糯,奶香浓郁

    手撕已经成为了中的一种常态,很多的是食品都有手撕版本,例如手撕牛肉,手撕豆腐干,手撕鸭,手撕鸡,手撕面包当然也有的...

  • 手撕鸡

    手撕鸡、手撕面包、手撕包菜、手撕牛肉,各种手撕做法,听起来就很手工的感觉。我做的手撕鸡纯粹懒人所为。 具体做法如下...

  • 美食十五-手撕鸡

    手撕鸡是一道家常菜,很难界定它的产地归属,手撕鸡有外皮金黄的盐焗鸡手撕,有风干鸡手撕,还有特色的手撕鸡丝。 手撕鸡...

  • 7月13日 星期五 多云

    手撕面包 我爱吃手撕面包。 今天早上,爸爸问我想吃什么?我说:“我想吃手撕面包。...

  • 【崔哥,您大胆往前冲!(1)】

    【崔哥,您大胆往前冲!(1)】 冯小刚要拍《手机2》,崔永元炸了。 他手撕冯小刚、手撕徐帆、手撕刘震云、手撕范冰冰...

  • 自己做的酸辣白菜,好香啊

    绝了,绝了,我真的是轻易不做饭,一做必惊艳啊。我这手撕辣白菜太好吃了!做法: 1.圆白菜洗净,手撕,一定要手撕,撕...

网友评论

      本文标题:手撕LRU

      本文链接:https://www.haomeiwen.com/subject/hevmiltx.html