IEnumerator <T> IEnumerable <T> .GetEnumerator() { DoubleLinkNode <T> node = FirstNode; while (node != null) { yield return(node.Value); node = node.Next; } }
void ICollection <T> .CopyTo(T[] array, int arrayIndex) { DoubleLinkNode <T> node = FirstNode; while (node.Next != null) { array[arrayIndex] = node.Value; arrayIndex++; node = node.Next; } }
bool ICollection <T> .Contains(T item) { DoubleLinkNode <T> node = FirstNode; while (node.Next != null) { if (node.Value.Equals(item)) { return(true); } node = node.Next; } return(false); }
bool ICollection <T> .Remove(T item) { if (Count == 0) { return(false); } else { DoubleLinkNode <T> previousNode = null; DoubleLinkNode <T> currenNode = FirstNode; while (currenNode != null) { if (currenNode.Value.Equals(item)) { // Match found if (previousNode != null) { // PreviousNode is set, we are past first node // Change pointers (disconnect previous -> current) previousNode.Next = currenNode.Next; // If current node was last node, previous becomes new Last if (currenNode.Next == null) { LastNode = previousNode; } Count--; } else { // Previous node never set, remove first node RemoveFirst(); } return(true); } // Move pointers previousNode = currenNode; currenNode = currenNode.Next; } return(false); } }
/// <summary> /// Add node to end of the list. /// </summary> /// <param name="node"></param> private void AddLast(DoubleLinkNode <T> node) { if (FirstNode == null && LastNode == null) { // New linked list. Incoming `node` is First and Last FirstNode = node; LastNode = FirstNode; } else { // Point last node to incoming `node`. Set `node` as Last. LastNode.Next = node; node.Previous = LastNode; LastNode = node; } Count++; }
public void RemoveLast() { if (Count > 0) { if (Count == 1) { FirstNode = LastNode = null; } else { // Get second to last node DoubleLinkNode <T> node = LastNode.Previous; node.Next = null; LastNode = node; } Count--; } }
/// <summary> /// Add node to beginning of list. /// </summary> /// <param name="node"></param> private void AddFirst(DoubleLinkNode <T> node) { // Copy first node DoubleLinkNode <T> previousFirst = FirstNode; // Make incoming `node` first FirstNode = node; // New first node will now point to previous first node FirstNode.Next = previousFirst; // If this is a new linked list, // First and Last are the same if (LastNode == null) { LastNode = FirstNode; } else { previousFirst.Previous = FirstNode; } Count++; }