LRU算法到底是怎么一回事?( 二 )

  • 移动元素到链表尾部
 public void moveNodeToTail(Node node) {        if (tail == node) {            return;        }      // 头节点直接置空        if (head == node) {   // 备注一            head = node.next;            head.pre = null;         } else {              // 备注一            node.pre.next = node.next;            node.next.pre = node.pre;        }     // 备注三        node.pre = tail;         node.next = null;        tail.next = node;        tail = node;    }
  • 看备注一&备注三如下图

LRU算法到底是怎么一回事?

文章插图
 
  • 看备注二&备注三如下图

LRU算法到底是怎么一回事?

文章插图
 
  • 删除头节点
 public Node removeHead() {       // 空链表        if (head == null) {            return null;        }        Node res = head;       // 只有一个节点        if (head == tail) {            head = null;            tail = null;        } else {        // 多个节点            head = res.next;            head.pre = null;            res.next = null;        }        return res;  }map.remove(delHead.k): 删除Map中的Kv映射关系
  • 添加新节点
   public void addLast(Node newNode) {       // 添加节点为空节点直接返回        if (newNode == null) {            return;        }       // 如果链表为空则直接添加        if (head == null) {            head = newNode;            tail = newNode;        } else {            // 不为空则尾部添加            tail.next = newNode;            newNode.pre = tail;            tail = newNode;        }    }如果链表为空则将该元素设置成表头元素同时也是表尾元素 。
五.获取元素
public V get(K key) {    Node node = map.get(key);    if (node != null) {        moveNodeToTail(node);        return node.v;    }    return null;}


推荐阅读