template <typename Object> class LinkedDeque { protected: // local node structure // ... (insert Node here) private: // member data NodePtr header; // pointer to header sentinel NodePtr trailer; // pointer to trailer sentinel int sz; // number of elements public: LinkedDeque() { // default constructor header = new Node; trailer = new Node; header->next = trailer; // trailer follows header trailer->prev = header; // header precedes trailer sz = 0; } // ... // return first element Object& first() throw(DequeEmptyException) { if (isEmpty()) throw DequeEmptyException("First of empty deque"); return header->next->element; } void insertFirst(const Object& e) { // insert new node at head NodePtr oldFirst = header->next; // old first node NodePtr t = new Node(e, header, oldFirst); // new node to insert oldFirst->prev = t; header->next = t; sz++; } void removeLast() { // remove node at tail if (isEmpty()) throw DequeEmptyException("Remove on empty deque"); NodePtr old = trailer->prev; // node to remove NodePtr newLast = old->prev; // new last node trailer->prev = newLast; newLast->next = trailer; sz--; delete old; } // ... (many functions omitted) };