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; }
private void MarkForDeletion(perLinkedListNode nodeToDelete) { var node = nodeToDelete; if (_iteratorCount > 0) { node.IsMarkedForDeletion = true; _nodesToDelete.Push(node); } else { Delete(node); } }
public void AddNodeAtHead(T data) { var newNode = new perLinkedListNode(data, this) { Next = Head }; Head = newNode; if (Tail == null) { Tail = newNode; } }
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; }