コード例 #1
0
 private void MoveToHead(LRUCacheNode node)
 {
     _head.Prev = node;
     node.Next  = _head;
     node.Prev  = null;
     _head      = node;
 }
コード例 #2
0
        public void Put(int key, int value)
        {
            if (_map.ContainsKey(key))
            {
                var node = _map[key];
                node.Value = value;

                if (_head == node)
                {
                    return;
                }
                else if (node == _tail)
                {
                    RemoveTail();
                }
                else
                {
                    RemoveNode(node);
                }

                MoveToHead(node);
            }
            else
            {
                var node = new LRUCacheNode(key, value);
                _map.Add(key, node);
                if (_count == _capacity) // evicts
                {
                    MoveToHead(node);
                    _map.Remove(_tail.Key);
                    RemoveTail();
                }
                else
                {
                    if (_head == null) // count 0
                    {
                        _head = _tail = node;
                    }
                    else if (_head == _tail) // count 1
                    {
                        _tail.Prev = node;
                        node.Next  = _tail;
                        _head      = node;
                    }
                    else
                    {
                        MoveToHead(node);
                    }
                    _count++;
                }
            }
        }
コード例 #3
0
        private void RemoveNode(LRUCacheNode node)
        {
            var prev = node.Prev;
            var next = node.Next;

            if (prev != null)
            {
                prev.Next = next;
            }
            if (next != null)
            {
                next.Prev = prev;
            }
        }
コード例 #4
0
 private void RemoveTail()
 {
     _tail      = _tail.Prev;
     _tail.Next = null;
 }