Beispiel #1
0
 public void RemoveNode(DoubleLinkNode <T> pNode)
 {
     if (pNode == null)
     {
         return;
     }
     if (pNode == Head)
     {
         Head = pNode.next;
     }
     if (pNode == Tail)
     {
         Tail = pNode.prev;
     }
     if (pNode.prev != null)
     {
         pNode.prev.next = pNode.next;
     }
     if (pNode.next != null)
     {
         pNode.next.prev = pNode.prev;
     }
     //回收
     pNode.next = pNode.prev = null;
     pNode.cur  = default(T);
     m_nodePool.Recycle(pNode);
     Count--;
 }
Beispiel #2
0
    public void MoveToHead(DoubleLinkNode <T> pNode)
    {
        if (pNode == null || pNode == Head)
        {
            return;
        }
        if (pNode == Tail)
        {
            Tail = pNode.prev;
        }
        if (pNode.prev != null)
        {
            pNode.prev.next = pNode.next;
        }
        if (pNode.next != null)
        {
            pNode.next.prev = pNode.prev;
        }
        pNode.prev = null;
        pNode.next = Head;
        Head.prev  = pNode;
        Head       = pNode;

        //感觉这种情况不存在
        if (Tail == null)
        {
            Head = Tail;
        }
    }
Beispiel #3
0
        public void Put(int key, int value)
        {
            if (hashMap.ContainsKey(key))
            {
                var node = hashMap[key];
                node.Value = value;
                MoveNodeToHead(node);
                return;
            }

            var newNode = new DoubleLinkNode()
            {
                Key   = key,
                Value = value
            };

            hashMap.Add(key, newNode);
            AddNodeToHead(newNode);
            size++;

            if (size > capacity)
            {
                var node = RemoveLatestNode();
                hashMap.Remove(node.Key);
                size--;
            }
        }
        private void RemoveNode(DoubleLinkNode node)
        {
            var previous = node.Prev;
            var next     = node.Next;

            previous.Next = next;
            next.Prev     = previous;
        }
Beispiel #5
0
        public void Visit(string url)
        {
            DoubleLinkNode <string> t = new DoubleLinkNode <string>(url);

            history.AddAfterNode(current, t);
            history.ClearAfter(t);
            current = t;
        }
Beispiel #6
0
 public string Forward(int steps)
 {
     while (current.next != null && steps != 0)
     {
         current = current.next;
         --steps;
     }
     return(current.Val);
 }
Beispiel #7
0
 public string Back(int steps)
 {
     while (current.prev != null && steps != 0)
     {
         current = current.prev;
         --steps;
     }
     return(current.Val);
 }
Beispiel #8
0
    public DoubleLinkNode <T> AddToTail(T t)
    {
        DoubleLinkNode <T> pNode = m_nodePool.Create(true);

        pNode.prev = null;
        pNode.next = null;
        pNode.cur  = t;
        return(AddToTail(pNode));
    }
Beispiel #9
0
    public bool Find(T t)
    {
        DoubleLinkNode <T> node = null;

        if (!m_tNodeMap.TryGetValue(t, out node) && node == null)
        {
            return(false);
        }
        return(true);
    }
Beispiel #10
0
 public void AddAfterNode(DoubleLinkNode <T> node, DoubleLinkNode <T> nodeToAdd)
 {
     nodeToAdd.next = node.next;
     node.next      = nodeToAdd;
     nodeToAdd.prev = node;
     if (node == Tail)
     {
         Tail = nodeToAdd;
     }
 }
        private void AddNodeToTail(DoubleLinkNode node)
        {
            var prev = dummyTail.Prev;

            node.Prev = prev;
            prev.Next = node;

            dummyTail.Prev = node;
            node.Next      = dummyTail;
        }
    /** Initialize your data structure here. Set the size of the deque to be k. */
    public MyCircularDeque(int k)
    {
        _head      = new DoubleLinkNode(-1);
        _tail      = new DoubleLinkNode(-1);
        _head.next = _tail;
        _tail.pre  = _head;

        _size = 0;
        _k    = k;
    }
Beispiel #13
0
        private void AddNodeToHead(DoubleLinkNode node)
        {
            var next = dummyHead.Next;

            node.Next = next;
            next.Prev = node;

            dummyHead.Next = node;
            node.Prev      = dummyHead;
        }
Beispiel #14
0
    public void Remove(T t)
    {
        DoubleLinkNode <T> node = null;

        if (m_tNodeMap.TryGetValue(t, out node))
        {
            m_doubleLinkList.RemoveNode(node);
            m_tNodeMap.Remove(t);
        }
    }
Beispiel #15
0
    public void InsertToHead(T t)
    {
        DoubleLinkNode <T> node = null;

        if (!m_tNodeMap.TryGetValue(t, out node))
        {
            m_doubleLinkList.AddToHead(t);
            m_tNodeMap.Add(t, m_doubleLinkList.Head);
        }
    }
Beispiel #16
0
    /// <summary>
    /// 移动到表头
    /// </summary>
    /// <param name="t"></param>
    /// <returns></returns>
    public bool MoveToHead(T t)
    {
        DoubleLinkNode <T> node = null;

        if (m_tNodeMap.TryGetValue(t, out node) && node != null)
        {
            m_doubleLinkList.MoveToHead(node);
            return(true);
        }
        return(false);
    }
Beispiel #17
0
        public _0146_LRUCache(int capacity)
        {
            this.size      = 0;
            this.capacity  = capacity;
            this.hashMap   = new Dictionary <int, DoubleLinkNode>();
            this.dummyHead = new DoubleLinkNode();
            this.dummyTail = new DoubleLinkNode();

            dummyHead.Next = dummyTail;
            dummyTail.Prev = dummyHead;
        }
        public _1429_FirstUniqueNumber(int[] nums)
        {
            this.hashMap   = new Dictionary <int, DoubleLinkNode>();
            this.dummyHead = new DoubleLinkNode();
            this.dummyTail = new DoubleLinkNode();

            dummyHead.Next = dummyTail;
            dummyTail.Prev = dummyHead;

            foreach (var num in nums)
            {
                Add(num);
            }
        }
Beispiel #19
0
 public void AddLast(DoubleLinkNode <T> node)
 {
     if (Tail == null)
     {
         Head = node;
         Tail = node;
     }
     else
     {
         Tail.next = node;
         node.prev = Tail;
         Tail      = node;
     }
 }
Beispiel #20
0
            public DoubleLinkNode AddAfter(int value)
            {
                var node = new DoubleLinkNode()
                {
                    Value = value
                };

                node.Prev = this;
                node.Next = this.Next;

                this.Next.Prev = node;
                this.Next      = node;
                return(node);
            }
Beispiel #21
0
        public void Setup()
        {
            node1 = new DoubleLinkNode();
            node2 = new DoubleLinkNode();
            node3 = new DoubleLinkNode();
            node4 = new DoubleLinkNode();
            node5 = new DoubleLinkNode();
            node6 = new DoubleLinkNode();


            node2.InsertAfter(node1);
            node3.InsertAfter(node2);
            node4.InsertAfter(node3);
            node5.InsertAfter(node4);
        }
        public bool MoveNext()
        {///这里是飞哥写的宝码;不要乱动
            if (end)
            {
                return(false);
            }

            if (node.IsTail)
            {
                DoubleLinkNode fakeTail = new DoubleLinkNode();
                fakeTail.InsertAfter(node);
                end = true;
            }//else nothing

            node = node.Next;
            return(true);

            //if (node.IsHead && i =_ 0)
            //{
            //    i++;
            //    j++;
            //    k++;
            //    node = node.Next.Previous;
            //    return true;
            //}
            //if (node.IsTail && k ==0)
            //{
            //    k++;
            //    j++;
            //    node = node.Previous.Next;
            //    return true;
            //}
            //if (!node.IsHead && j == 0)
            //{
            //    j++;
            //    k++;
            //    node = node.Next.Previous;
            //    return true;
            //}
            //if (!node.IsTail)
            //{
            //    node = node.Next;
            //    return true;
            //}
            //return false;
        }
    /** Adds an item at the rear of Deque. Return true if the operation is successful. */
    public bool InsertLast(int value)
    {
        if (_size == _k)
        {
            return(false);
        }

        var node = new DoubleLinkNode(value)
        {
            next = _tail, pre = _tail.pre
        };

        _tail.pre.next = node;
        _tail.pre      = node;

        _size++;

        return(true);
    }
Beispiel #24
0
 public DoubleLinkNode <T> AddToTail(DoubleLinkNode <T> pNode)
 {
     if (pNode == null)
     {
         return(null);
     }
     pNode.next = null;
     if (Tail == null)
     {
         Head = Tail = pNode;
     }
     else
     {
         Tail.next  = pNode;
         pNode.prev = Tail;
         Tail       = pNode;
     }
     Count++;
     return(Tail);
 }
    /** Adds an item at the front of Deque. Return true if the operation is successful. */
    public bool InsertFront(int value)
    {
        if (_size == _k)
        {
            return(false);
        }

        var node = new DoubleLinkNode(value)
        {
            pre  = _head,
            next = _head.next
        };

        _head.next.pre = node;
        _head.next     = node;

        _size++;

        return(true);
    }
Beispiel #26
0
        static void Main(string[] args)
        {
            var myNode = new DoubleLinkNode();

            myNode.ListInsert(5);
            myNode.ListInsert(8);
            myNode.ListInsert(12);
            myNode.ListInsert(34);
            myNode.ListInsert(36);
            myNode.ListInsert(85);
            myNode.ListInsert(242);
            Console.WriteLine();
            myNode.ListDelete(5);
            myNode.ListDelete(8);
            myNode.PrintList();
            Console.WriteLine();
            myNode.ListDelete(5);
            myNode.PrintList();
            Console.ReadLine();
        }
Beispiel #27
0
 public DoubleLinkNode <T> AddToHead(DoubleLinkNode <T> pNode)
 {
     if (pNode == null)
     {
         return(null);
     }
     pNode.prev = null;
     if (Head == null)
     {
         Head = Tail = pNode;
     }
     else
     {
         Head.prev  = pNode;
         pNode.next = Head;
         Head       = pNode;
     }
     Count++;
     return(Head);
 }
        public void Add(int value)
        {
            if (hashMap.ContainsKey(value))
            {
                if (hashMap[value] != null)
                {
                    var node = hashMap[value];
                    hashMap[value] = null;
                    RemoveNode(node);
                }
                return;
            }

            var newNode = new DoubleLinkNode()
            {
                Value = value
            };

            hashMap.Add(value, newNode);
            AddNodeToTail(newNode);
        }
Beispiel #29
0
            public static long CalculateHighScore(int players, int finalMarble)
            {
                var scores = new Dictionary <int, long>();

                for (int playerIndex = 0; playerIndex <= players - 1; playerIndex++)
                {
                    scores.Add(playerIndex, 0);
                }
                var            currPlayer = 0;
                DoubleLinkNode currNode   = new DoubleLinkNode()
                {
                    Value = 0
                };

                currNode.Prev = currNode;
                currNode.Next = currNode;
                currNode.AddAfter(1);
                for (int marbleCount = 2; marbleCount <= finalMarble; marbleCount++)
                {
                    if (marbleCount % 23 == 0)
                    {
                        scores[currPlayer] += marbleCount;

                        currNode            = currNode.MoveBackward(7);
                        scores[currPlayer] += currNode.Value;
                        currNode            = currNode.Remove();
                    }
                    else
                    {
                        currNode = currNode.MoveForward(1);
                        currNode = currNode.AddAfter(marbleCount);
                    }
                    currPlayer = (currPlayer + 1) % players;
                }

                return(scores.Max(x => x.Value));
            }
Beispiel #30
0
 private void MoveNodeToHead(DoubleLinkNode node)
 {
     RemoveNode(node);
     AddNodeToHead(node);
 }