// insert a node at beginning
        public void Insert(T data)
        {
            DoubleLinkedListNode <T> newLink = new DoubleLinkedListNode <T>(data);

            if (head != null)
            {
                head.Prev    = newLink;
                newLink.Next = head;
                head         = newLink;
            }
            else
            {
                head = newLink;
                tail = newLink;
            }
        }
        // insert after between two linknode
        public void Insertafter(DoubleLinkedListNode <T> _link, T _data)
        {
            if (_link == null)
            {
                return;
            }
            DoubleLinkedListNode <T> newLink = new DoubleLinkedListNode <T>(_data);

            newLink.Prev = _link;
            if (_link.Next != null)
            {
                _link.Next.Prev = newLink;
            }
            newLink.Next = _link.Next;
            _link.Next   = newLink;
        }
 public DoubleLinkedListNode()
 {
     data     = default(T);
     nextLink = null;
 }
 //public DoubleLinkedListNode(T val, DoubleLinkedListNode<T> p)
 //{
 //    data = val;
 //    nextLink = p;
 //}
 //public DoubleLinkedListNode(DoubleLinkedListNode<T> p)
 //{
 //    nextLink = p;
 //}
 public DoubleLinkedListNode(T val)
 {
     data     = val;
     prevLink = null;
     nextLink = null;
 }
 public DoubleLinkedList()
 {
     head = null;
     tail = null;
 }