public bool TryAdd(T x) { if (_items.ContainsKey(x)) { return(false); } var item = new DoublyLinkedItem <T>(x); _items.Add(x, item); if (FirstItem == null) { AddAtBegin(item); return(true); } if (item.Value.CompareTo(FirstItem.Value) >= 0) { AddAtBegin(item); } else { AddAtEnd(item); AdjustPosition(item); } return(true); }
public void AddAtEnd(T x) { if (_items.ContainsKey(x)) { return; } var item = new DoublyLinkedItem <T>(x); _items.Add(x, item); AddAtEnd(item); AdjustPosition(item); }
private void AddAtBegin(DoublyLinkedItem <T> item) { Count++; if (FirstItem == null) { FirstItem = item; LastItem = item; return; } item.Right = FirstItem; FirstItem.Left = item; FirstItem = item; }
private void Remove(DoublyLinkedItem <T> item) { if (item == FirstItem) { ExtractFirstItem(); return; } if (item == LastItem) { ExtractLastItem(); return; } Count--; var left = item.Left; var right = item.Right; left.Right = right; right.Left = left; }
private void AdjustPosition(DoublyLinkedItem <T> item) { while (item.Right != null && item.Value.CompareTo(item.Right.Value) < 0) { if (item.Right == null) { return; } var right = item.Right; var left = item.Left; if (FirstItem == item) { FirstItem = right; } item.Right = right.Right; item.Left = right; if (item.Right != null) { item.Right.Left = item; } right.Right = item; right.Left = left; if (left != null) { left.Right = right; } if (item.Right == null) { LastItem = item; } } while (item.Left != null && item.Value.CompareTo(item.Left.Value) > 0) { var right = item.Right; var left = item.Left; if (LastItem == item) { LastItem = left; } item.Right = left; item.Left = left.Left; if (left.Left != null) { left.Left.Right = item; } left.Right = right; left.Left = item; if (right != null) { right.Left = left; } if (item.Left == null) { FirstItem = item; } } }
public DoublyLinkedItem(T value) { Value = value; Left = null; Right = null; }