import java.util.NoSuchElementException;
public class ListTest2
{ public static void main(String[] args)
{ LinkedList staff = new LinkedList();
staff.addFirst("Tom");
staff.addFirst("Romeo");
staff.addFirst("Harry");
staff.addFirst("Dick");
// | in the comments indicates the iterator position
LinkedList.Iterator iterator
= staff.listIterator(); // |DHRS
iterator.next(); // D|HRS
iterator.next(); // DH|RS
// add more elements after second element
iterator.add("Juliet"); // DHJ|RS
iterator.add("Nina"); // DHJN|RS
iterator.next(); // DHJNR|S
// remove last traversed element
iterator.remove(); // DHJN|S
// print all elements
iterator = staff.listIterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
/**
A linked list is a sequence of links with efficient
element insertion and removal.
*/
class LinkedList
{ /**
Constructs an empty linked list.
*/
public LinkedList()
{ first = null;
}
/**
Returns the first element in the linked list.
@return the first element in the linked list
*/
public Object getFirst()
{ if (first == null)
throw new NoSuchElementException();
return first.data;
}
/**
Removes the first element in the linked list.
@return the removed element
*/
public Object removeFirst()
{ if (first == null)
throw new NoSuchElementException();
Object obj = first.data;
first = first.next;
return obj;
}
/**
Adds an element to the front of the linked list.
@param obj the object to add
*/
public void addFirst(Object obj)
{ ListNode newLink = new ListNode();
newLink.data = obj;
newLink.next = first;
first = newLink;
}
/**
Returns an iterator for iterating through this list.
@return an iterator for iterating through this list
*/
public Iterator listIterator()
{ return new Iterator();
}
private ListNode first;
private class ListNode
{ public Object data;
public ListNode next;
}
public class Iterator
{ /**
Constructs an iterator that points to the front
of the linked list.
*/
public Iterator()
{ position = null;
previous = null;
}
/**
Moves the iterator past the next element.
@return the traversed element
*/
public Object next()
{ if (position == null)
{ position = first;
return getFirst();
}
else
{ if (position.next == null)
throw new NoSuchElementException();
previous = position; // remember for remove
position = position.next;
return position.data;
}
}
/**
Tests if there is an element after the iterator
position.
@return true if there is an element after the iterator
position
*/
public boolean hasNext()
{ if (position == null)
return first != null;
else
return position.next != null;
}
/**
Adds an element before the iterator position
and moves the iterator past the inserted element.
@param obj the object to add
*/
public void add(Object obj)
{ if (position == null)
addFirst(obj);
else
{ ListNode newLink = new ListNode();
newListNode.data = obj;
newListNode.next = position.next;
position.next = newListNode;
position = newListNode;
previous = null;
}
}
/**
Removes the last traversed element. This method may
only be called after a call to the next() method.
*/
public void remove()
{ if (position == first)
removeFirst();
else
{ if (previous == null)
throw new IllegalStateException();
previous.next = position.next;
position = previous;
}
previous = null;
}
private ListNode position;
private ListNode previous;
}
}