import java.util.Iterator; public class CLList { ListNode head; public CLList() { head = new ListNode(null, null); head.setNext(head); } public void addFirst(Element obj) { head.setNext(new ListNode(obj, head.getNext())); } public void addLast(Element obj) { ListNode current = head; while(current.getNext() != head) current = current.getNext(); current.setNext(new ListNode(obj, head)); } // postcondition: first object in list that equals obj has been removed // returns true if an object is removed, returns false // if no object in list equals obj public boolean remove(Element obj) { ListNode current = head; while(current.getNext() != head && !current.getNext().getValue().equals(obj)) current = current.getNext(); if(current.getNext() == head) { return false; } else { current.setNext(current.getNext().getNext()); return true; } } public String toString() { String result = "["; ListNode current = head.getNext(); while(current != head) { result += current.getValue() + ", "; current = current.getNext(); } result += "]"; return result; } public Iterator iterator() { return new CLLIterator(); } private class CLLIterator implements Iterator { private ListNode current; private ListNode prev; public CLLIterator() { current = (ListNode)head; prev = null; } public boolean hasNext() { return current.getNext() != head; } public Element next() { if(current.getNext() != head) { prev = current; current = current.getNext(); return current.getValue(); } else throw new IllegalStateException("next called with hasNext false"); } public void remove() { if(prev != null) { prev.setNext(current.getNext()); current = prev; } else throw new IllegalStateException("iterator remove with no call to next"); } } }