public T Shift() { Header.Validate(x => x != null, new InvalidOperationException(Messages.DequeEmptyError)); var item = default(T); if (Header == Header.Previous && Header == Header.Next) { item = Header.Entry; Header = null; } else { var second = Header.Next; var last = Header.Previous; var first = Header; item = Header.Entry; last.Next = second; second.Previous = last; Header = second; first.Previous = null; first.Next = null; } return(item); }
private void MakeHeader(T item) { Header = new DoublyLinkedEntry <T>(); Header.Entry = item; Header.Next = Header; Header.Previous = Header; }
public void Append(T item) { if (Header == null) { MakeHeader(item); } else { var newEntry = new DoublyLinkedEntry <T>(); newEntry.Entry = item; newEntry.Previous = Header.Previous; Header.Previous.Next = newEntry; Header.Previous = newEntry; newEntry.Next = Header; } }
public T Pop() { Header.Validate(x => x != null, new InvalidOperationException(Messages.DequeEmptyError)); var item = default(T); if (Header == Header.Previous && Header == Header.Next) { item = Header.Entry; Header = null; } else { var last = Header.Previous; item = last.Entry; Header.Previous = last.Previous; last.Previous.Next = Header; last.Previous = null; last.Next = null; } return(item); }
public void Prepend(T item) { Append(item); Header = Header.Previous; }