/// <summary>
        /// This is the C# way to iterate (enumerate) elements
        /// </summary>
        /// <returns></returns>
        IEnumerator <T> IEnumerable <T> .GetEnumerator()
        {
            SNode <T> current = Head;

            while (current != null)
            {
                yield return(current.Data);

                current = current.Next;
            }
        }
        public SNode <T> Remove(T item)
        {
            SNode <T> found = FindPrevious(item);

            if (found != null)
            {
                found.Next = found.Next.Next;
                Count--;
            }

            return(found);
        }
        private void Reverse(SNode <T> node)
        {
            if (node == null)
            {
                return;
            }

            Reverse(node.Next);

            RemoveHead();
            Append(node.Data);
        }
        public void Prepend(T item)
        {
            SNode <T> newNode = new SNode <T>(item);

            newNode.Next = Head;
            Head         = newNode;

            if (Count == 0)
            {
                Tail = Head;
            }

            Count++;
        }
        public void Append(T item)
        {
            if (Count == 0)
            {
                Head = new SNode <T>(item);
                Tail = Head;
            }
            else
            {
                Tail = Tail.InsertAfter(item);
            }

            Count++;
        }
        public SNode <T> Find(T item)
        {
            var iter = GetIterator();

            while (iter.IsValid())
            {
                SNode <T> curr = iter.GetNode();

                if (EqualityComparer <T> .Default.Equals(curr.Data, item))
                {
                    return(curr);
                }

                iter.MoveNext();
            }
            return(null);
        }
        private SNode <T> FindPrevious(T item)
        {
            var iter = GetIterator();

            while (iter.IsValid())
            {
                SNode <T> curr = iter.GetNode();

                if (curr.Next != null && EqualityComparer <T> .Default.Equals(curr.Next.Data, item))
                {
                    return(curr);
                }

                iter.MoveNext();
            }

            return(null);
        }
 public SListIterator(SLinkedList <T> list)
 {
     Current = list.Head;
     Head    = list.Head;
 }