Esempio n. 1
0
        private DLinkedDicNode PopTail()
        {
            DLinkedDicNode result = Tail.Previous;

            RemoveNode(result);

            return(result);
        }
Esempio n. 2
0
        public LeetCode146(int capacity)
        {
            Capacity = capacity;
            Size     = 0;
            Head     = new DLinkedDicNode(0, 0);
            Tail     = new DLinkedDicNode(0, 0);

            // initialed an double linked list
            Head.Post     = Tail;
            Tail.Previous = Head;
        }
Esempio n. 3
0
 private void AddNode(DLinkedDicNode node)
 {
     // The following process is add the node in between Head node and second node
     // 1 <-> 5 now we want add 3
     // 1 <- 3
     node.Previous = Head;
     // 1 <- 3 -> 5
     node.Post = Head.Post;
     // 1 <- 3 <->5
     Head.Post.Previous = node;
     // 1 <-> 3 <-> 5
     Head.Post = node;
 }
Esempio n. 4
0
        private void RemoveNode(DLinkedDicNode node)
        {
            // the following logic should be to remove a node in double list
            // 1 <-> 3 <-> 5, we want remove 3
            // temp1       temp2 temp1 holds previous element, temp2 holds post value
            DLinkedDicNode temp1 = node.Previous;
            DLinkedDicNode temp2 = node.Post;

            // 1<- 3 <-> 5
            // 1 ->5
            temp1.Post = temp2;
            // 1 <-> 5
            temp2.Previous = temp1;
        }
Esempio n. 5
0
        public override string ToString()
        {
            StringBuilder sb = new StringBuilder();

            sb.Append("Hot[");
            while (Head != null)
            {
                sb.Append($"{Head.Value},");
                Head = Head.Post;
            }

            sb.Append("]Cold");

            return(sb.ToString());
        }
Esempio n. 6
0
        public void Put(int key, int value)
        {
            if (!cache.ContainsKey(key))
            {
                var newNode = new DLinkedDicNode(key, value);

                AddNode(newNode);
                cache.Add(key, newNode);
                Size++;

                if (Size > Capacity)
                {
                    var temp = PopTail();
                    cache.Remove(temp.Key);
                    Size--;
                }
            }
            else
            {
                cache[key].Value = value;

                MoveToHead(cache[key]);
            }
        }
Esempio n. 7
0
 private void MoveToHead(DLinkedDicNode node)
 {
     RemoveNode(node);
     AddNode(node);
 }