public SingleLinkedListNode <T> Reverse(SingleLinkedListNode <T> p)
        {
            if (_head == null || _head.Next == null)
            {
                return(_head);
            }
            var head = new SingleLinkedListNode <T>(_head.Data);

            head.Next = p;
            var cur = p.Next;

            p.Next = null;
            SingleLinkedListNode <T> next = default;

            while (cur != null)
            {
                //把tmlHead恒定的插入到到第二个结点
                next      = cur.Next;
                cur.Next  = head.Next;
                head.Next = cur;
                cur       = next;
            }
            //把头结点放到尾部
            var hnext = head.Next;

            head.Next = null;
            head      = hnext;
            return(head);
        }
        public void Remove(SingleLinkedListNode <T> node)
        {
            if (node == null || _head == null)
            {
                return;
            }
            //删除的是否为头结点
            if (node == _head)
            {
                _head = node.Next;
                return;
            }
            //找到node的上一个以及node的下一个
            var tempNode = _head;

            while (_head != null && tempNode.Next != node)
            {
                tempNode = tempNode.Next;
            }
            if (tempNode == null)
            {
                return;
            }
            tempNode.Next = tempNode.Next.Next;
        }
        public SingleLinkedListNode <T> MergeSortedList(SingleLinkedListNode <T> a, SingleLinkedListNode <T> b)
        {
            if (a == null)
            {
                return(b);
            }
            if (b == null)
            {
                return(a);
            }
            if (comparer == null)
            {
                throw new InvalidOperationException("must be provide IComparer");
            }
            var p = a;
            var q = b;
            SingleLinkedListNode <T> mergeNode;

            //比较头,来确定新合并之后的头结点
            if (comparer.Compare(p.Data, q.Data) < 0)
            {
                mergeNode = p;
                p         = p.Next;
            }
            else
            {
                mergeNode = q;
                q         = q.Next;
            }
            SingleLinkedListNode <T> r = mergeNode;

            while (p != null && q != null)
            {
                if (comparer.Compare(p.Data, q.Data) < 0)
                {
                    r.Next = p;
                    p      = p.Next;
                }
                else
                {
                    r.Next = q;
                    q      = q.Next;
                }
                r = r.Next;
            }
            if (p != null)
            {
                r.Next = p;
            }
            else
            {
                r.Next = q;
            }
            return(mergeNode);
        }
 public void InsertToHead(SingleLinkedListNode <T> newNode)
 {
     if (_head == null)
     {
         InsertNodeToEmptyList(newNode);
     }
     else
     {
         _head.Next   = newNode.Next;
         newNode.Next = _head;
         _head        = newNode;
     }
 }
        public void InsertToTail(SingleLinkedListNode <T> newNode)
        {
            var node     = _head;
            var tempNode = _head;

            while (tempNode.Next != null)
            {
                tempNode = tempNode.Next;
            }
            newNode.Next  = tempNode.Next;
            tempNode.Next = newNode;
            ++_count;
        }
        public void InsertToTail(T item)
        {
            var newNode = new SingleLinkedListNode <T>(item);

            if (_head == null)
            {
                InsertNodeToEmptyList(newNode);
            }
            else
            {
                InsertToTail(newNode);
            }
        }
        public void AddAfter(SingleLinkedListNode <T> node, T item)
        {
            var newNode = new SingleLinkedListNode <T>(item);

            if (_head == null)
            {
                InsertNodeToEmptyList(newNode);
            }
            else
            {
                newNode.Next = node.Next;
                node.Next    = newNode;
                ++_count;
            }
        }
        //用快慢指针,遍历同一个节点,如果快慢指针相等,则说明有环
        public bool HasCycle(SingleLinkedListNode <T> head)
        {
            if (head == null)
            {
                return(false);
            }
            SingleLinkedListNode <T> fast = head.Next.Next;
            SingleLinkedListNode <T> slow = head.Next;

            while (fast != null && fast.Next != null)
            {
                fast = fast.Next.Next;
                slow = slow.Next;
                if (slow == fast)
                {
                    return(true);
                }
            }
            return(false);
        }
 public void AddBefore(SingleLinkedListNode <T> node, T item)
 {
 }
        public void InsertToHead(T item)
        {
            var node = new SingleLinkedListNode <T>(item);

            InsertToHead(node);
        }
 private void InsertNodeToEmptyList(SingleLinkedListNode <T> newNode)
 {
     _head = newNode;
     _count++;
 }