Beispiel #1
0
        //虚拟删除后返回
        private DLinkedNode VirtualRemoveTail()
        {
            DLinkedNode res = tail.prev;

            VirtualRemoveNode(res);
            return(res);
        }
Beispiel #2
0
 public void Put(int key, int value)
 {
     if (cacheDict.ContainsKey(key))
     {
         DLinkedNode node = cacheDict[key];
         node.value = value;
         MoveToHead(node);
     }
     else
     {
         DLinkedNode node = new DLinkedNode(key, value);
         //真正添加节点
         cacheDict.Add(key, node);
         VirtualAddToHead(node);
         ++size;
         if (size > capacity)
         {
             // 如果超出容量,虚拟删除, 其实是删除双向链表的尾部节点
             DLinkedNode tail = VirtualRemoveTail();
             //真正删除节点
             cacheDict.Remove(tail.key);
             --size;
         }
     }
 }
Beispiel #3
0
 public LRUCache(int capacity)
 {
     this.capacity = capacity;
     this.size     = 0;
     this.head     = new DLinkedNode();
     this.tail     = new DLinkedNode();
     head.next     = tail;
     tail.prev     = head;
 }
Beispiel #4
0
        private void VirtualAddToHead(DLinkedNode node)
        {
            //修正自身节点的前后为头节点和次头节点。
            node.prev = head;
            node.next = head.next;
            //修改原有头部节点和次头部节点的连接关系,修改为自己的参照。
            head.next.prev = node;
            head.next      = node;

            //if (!cacheDict.ContainsKey(node.key))
            //    cacheDict.Add(node.key, node);
        }
Beispiel #5
0
 //虚拟删除(不返回)
 private void VirtualRemoveNode(DLinkedNode node)
 {
     //修改前后波节点的连接关系,删除自己的参照。
     node.prev.next = node.next;
     node.next.prev = node.prev;
 }
Beispiel #6
0
 private void MoveToHead(DLinkedNode node)
 {
     VirtualRemoveNode(node);
     VirtualAddToHead(node);
 }