// Textbook fragment 03.23 /** Inserts the given node z before the given node v. An error * occurs if v is the header */ public void addBefore(DNode v, DNode z) throws IllegalArgumentException { DNode u = getPrev(v); // may throw an IllegalArgumentException z.setPrev(u); z.setNext(v); v.setPrev(z); u.setNext(z); size++; } /** Inserts the given node z after the given node v. An error occurs * if v is the trailer */ public void addAfter(DNode v, DNode z) { DNode w = getNext(v); // may throw an IllegalArgumentException z.setPrev(v); z.setNext(w); w.setPrev(z); v.setNext(z); size++; } /** Inserts the given node at the head of the list */ public void addFirst(DNode v) { addAfter(header, v); } /** Inserts the given node at the tail of the list */ public void addLast(DNode v) { addBefore(trailer, v); } /** Removes the given node v from the list. An error occurs if v is * the header or trailer */ public void remove(DNode v) { DNode u = getPrev(v); // may throw an IllegalArgumentException DNode w = getNext(v); // may throw an IllegalArgumentException // unlink the node from the list w.setPrev(u); u.setNext(w); v.setPrev(null); v.setNext(null); size--; }