using System; public class LinkedQueue<T> { private LinkedQueueNode<T> start; private LinkedQueueNode<T> end; public LinkedQueue() { this.Count = 0; } public int Count { get; private set; } public void Enqueue(T element) { var newElement = new LinkedQueueNode<T>(element); if (this.Count == 0) { this.start = this.end = newElement; } else { this.end.Next = newElement; this.end = newElement; } this.Count++; } public T Dequeue() { if (this.Count <= 0) { throw new InvalidOperationException("Queue is empty."); } var elementToReturn = this.start; this.start = this.start.Next; this.Count--; return elementToReturn.Value; } public T Peak() { if (this.Count <= 0) { throw new InvalidOperationException("Queue is empty."); } var currentElement = this.start.Value; return currentElement; } public T[] ToArray() { var arrToReturn = new T[this.Count]; var currentNode = this.start; var arrIndex = 0; while (currentNode != null) { arrToReturn[arrIndex] = currentNode.Value; arrIndex++; currentNode = currentNode.Next; } return arrToReturn; } private class LinkedQueueNode<T> { public LinkedQueueNode(T value) { this.Value = value; } public T Value { get; private set; } public LinkedQueueNode<T> Next { get; set; } } }