private void InsertFirstNode(CircularLinkedListNode <T> node)
 {
     node.Next     = node;
     node.Previous = node;
     head          = node;
     _Count++;
 }
 public void MoveHeadLeft(int steps)
 {
     steps %= _Count;
     for (; steps > 0; steps--)
     {
         head = First.Previous;
     }
 }
 public void MoveHeadRight(int steps)
 {
     steps %= _Count;
     for (; steps > 0; steps--)
     {
         head = First.Next;
     }
 }
 private void InsertBefore(CircularLinkedListNode <T> origin, CircularLinkedListNode <T> node)
 {
     node.Next            = origin;
     node.Previous        = origin.Previous;
     origin.Previous.Next = node;
     origin.Previous      = node;
     _Count++;
 }
        public CircularLinkedListNode <T> ElementAt(int index)
        {
            index %= _Count;
            CircularLinkedListNode <T> current = head;

            for (int _ = 0; _ < index; _++)
            {
                current = current.Next;
            }
            return(current);
        }
        public IEnumerable <T> GetValues()
        {
            CircularLinkedListNode <T> current = head;

            do
            {
                yield return(current.Value);

                current = current.Next;
            } while (current != head);
        }
        public IEnumerator <CircularLinkedListNode <T> > GetEnumerator()
        {
            CircularLinkedListNode <T> current = head;

            do
            {
                yield return(current);

                current = current.Next;
            } while (current != head);
        }
        public T[] ToArray()
        {
            T[] arr = new T[_Count];
            CircularLinkedListNode <T> current = head;

            for (int i = 0; i < arr.Length; i++)
            {
                arr[i]  = current.Value;
                current = current.Next;
            }
            return(arr);
        }
        public CircularLinkedListNode <T> AddLast(T value)
        {
            CircularLinkedListNode <T> result = new CircularLinkedListNode <T>(value);

            if (head == null)
            {
                InsertFirstNode(result);
            }
            else
            {
                InsertBefore(head, result);
            }
            return(result);
        }
        public CircularLinkedListNode <T> FindElementByValue(T itemValue)
        {
            CircularLinkedListNode <T> current = head;

            do
            {
                if (current.Value.Equals(itemValue))
                {
                    return(current);
                }
                current = current.Next;
            } while (current != head);
            return(null);
        }
 public void Remove(CircularLinkedListNode <T> node)
 {
     if (node.Next == node)
     {
         head = null;
     }
     else
     {
         node.Next.Previous = node.Previous;
         node.Previous.Next = node.Next;
         if (head == node)
         {
             head = node.Next;
         }
     }
     _Count--;
 }
        public void AddAfter(CircularLinkedListNode <T> origin, T value)
        {
            CircularLinkedListNode <T> node = new CircularLinkedListNode <T>(value);

            InsertBefore(origin.Next, node);
        }
 public void AddAfter(CircularLinkedListNode <T> origin, CircularLinkedListNode <T> node)
 {
     InsertBefore(origin.Next, node);
 }