예제 #1
0
        IEnumerator <T> IEnumerable <T> .GetEnumerator()
        {
            DoubleLinkNode <T> node = FirstNode;

            while (node != null)
            {
                yield return(node.Value);

                node = node.Next;
            }
        }
예제 #2
0
        void ICollection <T> .CopyTo(T[] array, int arrayIndex)
        {
            DoubleLinkNode <T> node = FirstNode;

            while (node.Next != null)
            {
                array[arrayIndex] = node.Value;
                arrayIndex++;
                node = node.Next;
            }
        }
예제 #3
0
        bool ICollection <T> .Contains(T item)
        {
            DoubleLinkNode <T> node = FirstNode;

            while (node.Next != null)
            {
                if (node.Value.Equals(item))
                {
                    return(true);
                }

                node = node.Next;
            }

            return(false);
        }
예제 #4
0
        bool ICollection <T> .Remove(T item)
        {
            if (Count == 0)
            {
                return(false);
            }
            else
            {
                DoubleLinkNode <T> previousNode = null;
                DoubleLinkNode <T> currenNode   = FirstNode;

                while (currenNode != null)
                {
                    if (currenNode.Value.Equals(item))
                    {
                        // Match found
                        if (previousNode != null)
                        {
                            // PreviousNode is set, we are past first node

                            // Change pointers (disconnect previous -> current)
                            previousNode.Next = currenNode.Next;

                            // If current node was last node, previous becomes new Last
                            if (currenNode.Next == null)
                            {
                                LastNode = previousNode;
                            }

                            Count--;
                        }
                        else
                        {
                            // Previous node never set, remove first node
                            RemoveFirst();
                        }

                        return(true);
                    }

                    // Move pointers
                    previousNode = currenNode;
                    currenNode   = currenNode.Next;
                }
                return(false);
            }
        }
예제 #5
0
 /// <summary>
 /// Add node to end of the list.
 /// </summary>
 /// <param name="node"></param>
 private void AddLast(DoubleLinkNode <T> node)
 {
     if (FirstNode == null && LastNode == null)
     {
         // New linked list. Incoming `node` is First and Last
         FirstNode = node;
         LastNode  = FirstNode;
     }
     else
     {
         // Point last node to incoming `node`. Set `node` as Last.
         LastNode.Next = node;
         node.Previous = LastNode;
         LastNode      = node;
     }
     Count++;
 }
예제 #6
0
        public void RemoveLast()
        {
            if (Count > 0)
            {
                if (Count == 1)
                {
                    FirstNode = LastNode = null;
                }
                else
                {
                    // Get second to last node
                    DoubleLinkNode <T> node = LastNode.Previous;
                    node.Next = null;
                    LastNode  = node;
                }

                Count--;
            }
        }
예제 #7
0
        /// <summary>
        /// Add node to beginning of list.
        /// </summary>
        /// <param name="node"></param>
        private void AddFirst(DoubleLinkNode <T> node)
        {
            // Copy first node
            DoubleLinkNode <T> previousFirst = FirstNode;

            // Make incoming `node` first
            FirstNode = node;

            // New first node will now point to previous first node
            FirstNode.Next = previousFirst;

            // If this is a new linked list,
            // First and Last are the same
            if (LastNode == null)
            {
                LastNode = FirstNode;
            }
            else
            {
                previousFirst.Previous = FirstNode;
            }

            Count++;
        }