public void AddLast(LoopNode <T> node) { size++; if (first == null) { first = node; } if (last == null) { last = node; } node.previous = last; node.next = first; first.previous = node; last.next = node; last = node; }
public void InsertAfter(LoopNode <T> node, T value) { #if DEBUG if (node.list != this) { throw new InvalidOperationException("'node' should be of the same list"); } #endif size++; var newNode = new LoopNode <T>(this, value); if (last == node) { last = newNode; } newNode.previous = node; newNode.next = node.next; node.next.previous = newNode; node.next = newNode; }
public void AddFirst(T value) { size++; var node = new LoopNode <T>(this, value); if (first == null) { first = node; } if (last == null) { last = node; } node.previous = last; node.next = first; first.previous = node; last.next = node; first = node; }
public void InsertAfter(LoopNode <T> position, LoopNode <T> nodeFrom, LoopNode <T> nodeTo) { #if DEBUG if (position.list != this) { throw new ArgumentException("position argument must belong to current colliction"); } if (nodeFrom.list == this) { throw new ArgumentException("nodeFrom argument must not belong to current colliction"); } if (nodeFrom.list != nodeTo.list) { throw new ArgumentException("nodeFrom and nodeTo arguments must belong to the same colliction"); } #endif var node = nodeFrom; int counter = 1; for (; ;) { if (node == nodeTo) { break; } if (counter > node.list.size) { throw new InvalidOperationException(); } node = node.next; ++counter; } var otherList = nodeFrom.list; size += counter; otherList.size -= counter; if (otherList.size == 0) { otherList.first = null; otherList.last = null; } else { throw new InvalidOperationException("Not full utilization is not supportet now."); } if (position == last) { last = nodeTo; } var posNext = position.next; position.next = nodeFrom; posNext.previous = nodeTo; nodeFrom.previous = position; nodeTo.next = posNext; node = nodeFrom; for (; ;) { node.list = this; if (node == nodeTo) { break; } node = node.next; } }
public void AddLast(T value) { var node = new LoopNode <T>(this, value); AddLast(node); }