public void AddAfter(ConcurrentLinkedListNode <T> node, ConcurrentLinkedListNode <T> item)
        {
            if (_root == null)
            {
                throw new Exception("The linked list isn't contains nodes");
            }

            SetNewNodeAfterTargetNode(node, item);
        }
 public void AddLast(ConcurrentLinkedListNode <T> item)
 {
     if (_root == null)
     {
         InitializeRootNode(item);
     }
     else
     {
         Last.Next = item;
         item.Prev = Last;
         Last      = item;
     }
 }
        public ConcurrentLinkedListNode <T> AddAfter(ConcurrentLinkedListNode <T> node, T item)
        {
            if (_root == null)
            {
                throw new Exception("The linked list isn't contains nodes");
            }

            var newNode = new ConcurrentLinkedListNode <T>()
            {
                Value = item
            };

            SetNewNodeAfterTargetNode(node, newNode);

            return(newNode);
        }
        public ConcurrentLinkedListNode <T> AddLast(T item)
        {
            var newNode = new ConcurrentLinkedListNode <T>()
            {
                Value = item
            };

            if (_root == null)
            {
                InitializeRootNode(newNode);
            }
            else
            {
                Last.Next    = newNode;
                newNode.Prev = Last;
                Last         = newNode;
            }

            return(newNode);
        }
        private void SetNewNodeAfterTargetNode(ConcurrentLinkedListNode <T> targetNode, ConcurrentLinkedListNode <T> newNode)
        {
            var pointer = _root;

            while (pointer != null)
            {
                if (pointer != targetNode)
                {
                    pointer = pointer.Next;
                }
                else
                {
                    break;
                }
            }

            if (pointer == null)
            {
                AddLast(newNode);
            }
            else
            {
                var nextNode = pointer.Next;
                pointer.Next = newNode;
                newNode.Prev = pointer;
                newNode.Next = nextNode;

                if (nextNode != null)
                {
                    nextNode.Prev = newNode;
                }
                else
                {
                    Last = newNode;
                }
            }
        }
        private void SetNewNodeBeforeTargetNode(ConcurrentLinkedListNode <T> targetNode, ConcurrentLinkedListNode <T> newNode)
        {
            var pointer = _root;

            while (pointer != null)
            {
                if (pointer != targetNode)
                {
                    pointer = pointer.Next;
                }
                else
                {
                    break;
                }
            }

            if (pointer == null)
            {
                AddFirst(newNode);
            }
            else
            {
                var prevNode = pointer.Prev;
                pointer.Prev = newNode;
                newNode.Next = pointer;
                newNode.Prev = prevNode;

                if (prevNode != null)
                {
                    prevNode.Next = newNode;
                }
                else
                {
                    First = newNode;
                }
            }
        }
 public (ConcurrentLinkedListNode <T>, bool) TryAddBefore(ConcurrentLinkedListNode <T> node, ConcurrentLinkedListNode <T> item, TimeSpan timeCallBack)
 {
     throw new NotImplementedException();
 }
 private void InitializeRootNode(ConcurrentLinkedListNode <T> item)
 {
     _root = item;
     First = _root;
     Last  = _root;
 }
 public bool TryAddLast(ConcurrentLinkedListNode <T> item, TimeSpan timeCallBack)
 {
     throw new NotImplementedException();
 }
 public ConcurrentLinkedListNode <T> TryAddAfter(ConcurrentLinkedListNode <T> node, ConcurrentLinkedListNode <T> item, TimeSpan timeCallBack)
 {
     throw new NotImplementedException();
 }