mutators override inherited version to return positionrather than node def insert between(selfepredecessorsuccessor)"""add element between existing nodes and return new position ""node superinsert between(epredecessorsuccessorreturn self make position(nodedef add first(selfe)"""insert element at the front of the list and return new position ""return self insert between(eself headerself header nextdef add last(selfe)"""insert element at the back of the list and return new position ""return self insert between(eself trailer prevself trailerdef add before(selfpe)"""insert element into list before position and return new position ""original self validate(preturn self insert between(eoriginal prevoriginaldef add after(selfpe)"""insert element into list after position and return new position ""original self validate(preturn self insert between(eoriginaloriginal nextdef delete(selfp)"""remove and return the element at position ""original self validate(pinherited method returns element return self delete node(originaldef replace(selfpe)"""replace the element at position with return the element formerly at position ""original self validate(ptemporarily store old element old value original element replace with new element original element return the old element value return old value code fragment positionallist class based on doubly linked list (continued from code fragments and