/** Singly linked list node */
class Link<T> {
    private T element; // Value for this node
    private Link<T> next; // Pointer to next node in list

    // Constructors
    Link(T it, Link<T> nextVal)
    { element = it; next = nextVal; }
    Link(Link<T> nextVal) { next = nextVal; }

    Link<T> next()  {return next; } // Return nrxt field
    Link<T> setNext(Link<T> nextVal) // Set next field
    { return next = nextVal; } // Return element field
    T element() { return element; } // Set element field
    T setElement(T it) { return element = it; }

    /** Extensions to support freelists */
    static Link freelist = null; // Freelist for the class

    /** @return A new link */
    static <T> Link<T> get(Tit, Link<T> nextVal) {
	if (freelist == null)
	    return new Link<T>(it, nextVal); // Get from "new"
	Link<T> temp = freelist; // Get from freelist
	freelist = freelist.next();
	temp.setElement(it);
	temp.setNext(nextVal);

	return temp;
    }

    /** Return a link to the freelist */
    void release() {
	element = null; // Drop reference to the element
	next = freelist;
	freelist = this;
    }
}