// Singly-linked list node with freelist support template class Link { private: static Link* freelist; // Head of the freelist public: Elem element; // Value for this node Link* next; // Point to next node in list Link(const Elem& elemval, Link* nextval =NULL) { element = elemval; next = nextval; } Link(Link* nextval =NULL) { next = nextval; } void* operator new(size_t); // Overloaded new operator void operator delete(void*); // Overloaded delete operator }; template Link* Link::freelist = NULL; template // Overload for new operator void* Link::operator new(size_t) { if (freelist == NULL) return ::new Link; // Create space Link* temp = freelist; // Can take from freelist freelist = freelist->next; return temp; // Return the link } template // Overload for delete operator void Link::operator delete(void* ptr) { ((Link*)ptr)->next = freelist; // Put on freelist freelist = (Link*)ptr; }