Example #1
0
        private void Delete(perLinkedListNode nodeToDelete)
        {
            if (_iteratorCount > 0)
            {
                throw new InvalidOperationException("You may not delete a node when iterating. Use MarkForDeletion instead.");
            }

            var previousNode = nodeToDelete.Previous;
            var nextNode     = nodeToDelete.Next;

            if (previousNode != null)
            {
                previousNode.Next = nextNode;
            }

            if (nextNode != null)
            {
                nextNode.Previous = previousNode;
            }

            if (nodeToDelete == Head)
            {
                Head = nextNode;
            }

            if (nodeToDelete == Tail)
            {
                Tail = previousNode;
            }

            nodeToDelete.Next     = null;
            nodeToDelete.Previous = null;
        }
Example #2
0
        private void MarkForDeletion(perLinkedListNode nodeToDelete)
        {
            var node = nodeToDelete;

            if (_iteratorCount > 0)
            {
                node.IsMarkedForDeletion = true;
                _nodesToDelete.Push(node);
            }
            else
            {
                Delete(node);
            }
        }
Example #3
0
        public void AddNodeAtHead(T data)
        {
            var newNode = new perLinkedListNode(data, this)
            {
                Next = Head
            };

            Head = newNode;

            if (Tail == null)
            {
                Tail = newNode;
            }
        }
Example #4
0
        public void AddNodeAtTail(T data)
        {
            var newNode = new perLinkedListNode(data, this);

            if (Tail == null)
            {
                Tail = newNode;
                Head = newNode;
                return;
            }

            var previousLast = Tail;

            previousLast.Next = newNode;
            newNode.Previous  = previousLast;
            Tail = newNode;
        }