lru缓存策略

  class ListNode {
      int val;
      int key;
      ListNode next;
      ListNode pre;
      ListNode(int x, int y) {
          key = x;
          val = y;
          next = null;
          pre = null;
      }
 }
  class HListNode {
      int len;
      ListNode head;
      ListNode tail;
    
    HListNode(){
        head = null;
        tail = null;
        len = 0;
    }
    
    public int get(int key, ListNode[] no){
        ListNode temp_head = head;
        while (temp_head != null) {
            if (temp_head.key == key) {
                no[0] = temp_head;
                return temp_head.val;
            } else {
                temp_head = temp_head.next;
            }
        }
        return -1;
    }
    
    public void delNode(ListNode node){
        if (node == null) {
            return;
        } else {
            if (node.pre != null) {
                node.pre.next = node.next;
            } else {
                head = node.next;
            }
            if (node.next != null) {
                node.next.pre = node.pre;
            } else {
                tail = node.pre;
            }
            len--;
            node.next = null;
            node.pre = null;
        }
    }
    
    
    public void addNodeBeforeHead(ListNode node){
        if (node == null) {
            return;
        }
        if (head == null) {
            head = node;
            tail = node;
            len++;
        } else {
            node.next = head;
            head.pre = node;
            head = node;
            len++;
        }
    }
      
    public void addBeforeHead(int key, int val){
        ListNode temp_node = new ListNode(key, val);
        if (head == null) {
            head = temp_node;
            tail = temp_node;
        } else {
            temp_node.next = head;
            head.pre = temp_node;
            head = temp_node;
        }
        len++;
    }
    
    public ListNode isHasKey(int key){
        ListNode temp_head = head;
        while (temp_head != null) {
            if (temp_head.key == key) {
                return temp_head;
            } else {
                temp_head = temp_head.next;
            }
        }
        return null;
    }
    
    public void delAfterTail(){
          if (tail == null) {
            return;
          } else {
              if (tail.pre == null) {
                head = null;
                tail = null;
                len = 0;
              } else {
                tail = tail.pre;
                tail.next = null;    
                len--;
              }
              
          }
    }
 }
public class LRUCache {
    int capacity;
    HListNode Hnode = new HListNode(); 
    /*
    * @param capacity: An integer
    */public LRUCache(int capacity) {
        // do intialization if necessary
        this.capacity = capacity;
    }

    /*
     * @param key: An integer
     * @return: An integer
     */
    public int get(int key) {
        // write your code here
        ListNode[] no = new ListNode[1];
        int val = Hnode.get(key, no);
        if (val != -1) {
            Hnode.delNode(no[0]);
            Hnode.addNodeBeforeHead(no[0]);
        }
        return val;
    }

    /*
     * @param key: An integer
     * @param value: An integer
     * @return: nothing
     */
    public void set(int key, int value) {
        // write your code here
        ListNode no = Hnode.isHasKey(key);
        if (no != null) {
            Hnode.delNode(no);
        }
        if (Hnode.len >= capacity) {
            Hnode.delAfterTail();
        }
        Hnode.addBeforeHead(key ,value);
    }
}

 

lru规则简介:

总容量有限,插入时发现已经有这个key了,就需要把这个key  value更新,并且放到最前面。 如果发现容量满了,那么就删除最后的元素。

每次读取某一个元素之后就把该元素挪到最前面。

我的思路:

基础数据结构是双端链表

然后新建一个数据结构,里面有head  tail分别指向双端链表的头和尾,len用来表示这个链表的长度,然后写一些这个数据结构增删改查的API,就简单了。

posted @ 2018-04-16 02:34  萝卜er  阅读(366)  评论(0编辑  收藏  举报