package simset;

public class Linkage {
	public final Link pred() 
	    { return PRED instanceof Link ? (Link) PRED : null; }
	public final Link suc() 
	    { return SUC instanceof Link ? (Link) SUC : null; }
	public final Linkage prev() 
		{ return PRED; }
	Linkage PRED, SUC;
}

public class Link extends Linkage {
	public final void out() {
		if (SUC != null) {
			SUC.PRED = PRED;
			PRED.SUC = SUC;
			SUC = PRED = null;
		}
	}	
	public final void follow(Linkage ptr) {
		out();
		if (ptr != null && ptr.SUC != null) {
			PRED = ptr;
			SUC = ptr.SUC;
			SUC.PRED = ptr.SUC = this;
		}
	}	
	public final void precede(Linkage ptr) {
		out();
		if (ptr != null && ptr.SUC != null) {
			SUC = ptr;
			PRED = ptr.PRED;
			PRED.SUC = ptr.PRED = this;
		}
	}	
	public final void into(Head s) { precede(s); }
}

public class Head extends Linkage {
	public Head() { PRED = SUC = this; }
	public final Link first() { return suc(); }
	public final Link last() { return pred(); }
	public final boolean empty() { return SUC == this; }
	public final int cardinal() {
		int i = 0;
		for (Link ptr = first(); ptr != null; ptr = ptr.suc())
			i++;
		return i;
	}
	public final void clear() 
		{ while (first() != null) first().out(); }
}

