class Listnode { K key; D data; Listnode pred, succ; public Listnode(K k, D d) { key = k; data = d; pred = null; succ = null; } public void delete() { pred.succ = succ; succ.pred = pred; } public void copy(Listnode n) { key = n.key; data = n.data; } void append(Listnode newnode) { newnode.succ = succ; newnode.pred = this; succ.pred = newnode; succ = newnode; } } public class List extends Dictionary { Listnode head; public List() { head = new Listnode(null, null); head.pred = head.succ = head; } public void insert(K k, D d) { Listnode n = findnode(k); if(n!=null) n.copy(new Listnode(k, d)); else head.append(new Listnode(k, d)); } public boolean iselement(K k) { return find(k) != null; } public void append(K k, D d) { head.pred.append(new Listnode(k, d)); } public void prepend(K k, D d) { head.append(new Listnode(k, d)); } Listnode firstnode() { return head.succ; } Listnode lastnode() { return head.pred; } Listnode findnode(K k) { Listnode n; head.key = k; for(n=head.succ; !n.key.equals(k); n=n.succ) ; head.key = null; if(n==head) return null; return n; } public D find(K k) { Listnode n = findnode(k); if(n==null) return null; return n.data; } public void delete(K k) { Listnode n = findnode(k); if(n!=null) n.delete(); } public Iterator iterator() { ListIterator iter = new ListIterator(this); return iter; } } class ListIterator extends Iterator { List l; Listnode n; public ListIterator(List l) { this.l = l; n = l.head.succ; } public boolean more() { return n!=l.head; } public K key() { return n.key; } public D data() { return n.data; } Listnode node() { return n; } public void step() { n = n.succ; } public void delete() { Listnode temp = n; n.delete(); n = temp; } public void append(K k, D d) { n.append(new Listnode(k, d)); } public void prepend(K k, D d) { n.pred.append(new Listnode(k, d)); } }