DavidWang1997 / wpblog.GitHub.io

A temporary blog for recording my thoughts of coding problems
2 stars 0 forks source link

146. LRU Cache #115

Open DavidWang1997 opened 4 years ago

DavidWang1997 commented 4 years ago

image

DavidWang1997 commented 4 years ago

`class LRUCache {

private int maxCapacity;
private int cap;
private Map<Integer, ListNode> map;
private ListNode head, tail;

public LRUCache(int capacity) {
    this.maxCapacity = capacity;
    cap = 0;
    map = new HashMap<>();

    head = new ListNode();
    tail = new ListNode();
    head.next = tail;
    tail.prev = head;

}

public int get(int key) {
    ListNode target = map.get(key);

    if(target == null) return -1;

    moveToHead(target);

    return target.val;
}

public void put(int key, int value) {
    ListNode target = map.get(key);

    if(target != null){
        target.val = value;
        map.put(key, target);
        removeFromList(target);
        addToHead(target);
        return;
    }

    if(cap == maxCapacity) removeLast();

    target = new ListNode();

    target.val = value;
    target.key = key;

    addToHead(target);

    map.put(key,target);

    cap++;

}

private void removeLast(){
    ListNode node = tail.prev;
    ListNode prev = node.prev;
    map.remove(node.key);
    prev.next = tail;
    tail.prev = prev;
    cap --;
}

private void moveToHead(ListNode node){
    removeFromList(node);
    addToHead(node);
}

private void removeFromList(ListNode node){
    ListNode prev = node.prev;
    ListNode next = node.next;

    prev.next = next;
    next.prev = prev;
}

private void addToHead(ListNode node){
    ListNode next = head.next;

    head.next = node;

    node.next = next;
    node.prev = head;

    next.prev = node;
}

private class ListNode{
    int val;
    int key;
    ListNode prev;
    ListNode next;
}

}

/**

DavidWang1997 commented 4 years ago

image