sclass TokenIndexedList extends RandomAccessAbstractList { new Map index; // first occurrence of token new L list; sclass Token { S s; Token prevSame, nextSame; } public S get(int i) { ret list.get(i).s; } public int size() { ret list.size(); } public void set(int i, S s) { Token t = list.get(i); if (eq(t.s, s)) ret; // remove from chain if (t.prevSame == null) index.put(t.s, t.nextSame); else t.prevSame.nextSame = t.nextSame; if (t.nextSame != null) t.nextSame.prevSame = t.nextSame; // change token, add to chain Token t2 = index.get(s); t.s = s; ... } }