/// <summary> /// Time complexity: O(1). /// </summary> internal void Union(DoublyLinkedList <T> newList) { if (Head == null) { Head = newList.Head; Tail = newList.Tail; return; } if (newList.Head == null) { return; } Head.Previous = newList.Tail; newList.Tail.Next = Head; Head = newList.Head; }
public bool MoveNext() { if (headNode == null) { return(false); } if (currentNode == null) { currentNode = headNode; return(true); } if (currentNode.Next != null) { currentNode = currentNode.Next; return(true); } return(false); }
/// <summary> /// Time complexity: O(1). /// </summary> /// <returns>The new node.</returns> public DoublyLinkedListNode <T> InsertFirst(T data) { var newNode = new DoublyLinkedListNode <T>(data); if (Head != null) { Head.Previous = newNode; } newNode.Next = Head; newNode.Previous = null; Head = newNode; if (Tail == null) { Tail = Head; } return(newNode); }
/// <summary> /// Insert right after this node. /// Time complexity: O(1). /// </summary> public DoublyLinkedListNode <T> InsertAfter(DoublyLinkedListNode <T> node, DoublyLinkedListNode <T> data) { if (node == null) { throw new Exception("Empty reference node"); } if (node == Head && node == Tail) { node.Next = data; node.Previous = null; data.Previous = node; data.Next = null; Head = node; Tail = data; return(data); } if (node != Tail) { data.Previous = node; data.Next = node.Next; node.Next.Previous = data; node.Next = data; } else { data.Previous = node; data.Next = null; node.Next = data; Tail = data; } return(data); }
/// <summary> /// Insert right before this node. /// Time complexity:O(1). /// </summary> public DoublyLinkedListNode <T> InsertBefore(DoublyLinkedListNode <T> node, DoublyLinkedListNode <T> data) { if (node == null) { throw new Exception("Empty node"); } if (node == Head && node == Tail) { node.Previous = data; node.Next = null; Tail = node; data.Previous = null; data.Next = node; Head = data; return(data); } if (node == Head) { data.Previous = null; data.Next = node; node.Previous = data; Head = data; } else { data.Previous = node.Previous; data.Next = node; node.Previous.Next = data; node.Previous = data; } return(data); }
/// <summary> /// Delete tail node. /// Time complexity: O(1) /// </summary> /// public T DeleteLast() { if (Tail == null) { throw new Exception("Empty list"); } var tailData = Tail.Data; if (Tail == Head) { Head = null; Tail = null; } else { Tail.Previous.Next = null; Tail = Tail.Previous; } return(tailData); }
/// <summary> /// Time complexity: O(1). /// </summary> public T DeleteFirst() { if (Head == null) { throw new Exception("Empty list"); } var headData = Head.Data; if (Head == Tail) { Head = null; Tail = null; } else { Head.Next.Previous = null; Head = Head.Next; } return(headData); }
public void Dispose() { headNode = null; currentNode = null; }
public void Reset() { currentNode = headNode; }
internal DoublyLinkedListEnumerator(ref DoublyLinkedListNode <T> headNode) { this.headNode = headNode; }