Reverse a doubly linkedlist. Looking for code review, optimizations and best practices.
public class ReverseDoublyLinkedList<T> implements Iterable<T> {
private Node<T> first;
private Node<T> last;
private int size;
public ReverseDoublyLinkedList() { };
public ReverseDoublyLinkedList(List<T> c) {
for (T item : c) {
add(item);
}
};
public void add (T t) {
final Node<T> l = last;
final Node<T> node = new Node<T>(null, t, null);
last = node;
if (first == null) {
first = node;
} else {
l.right = node;
node.left = l;
}
size++;
}
private static class Node<T> {
Node<T> left;
T item;
Node<T> right;
public Node(Node<T> left, T item, Node<T> right) {
this.left = left;
this.item = item;
this.right = right;
}
}
public void reverse() {
if (first == null) {
throw new IllegalArgumentException("The root cannot be null.");
}
Node<T> node = first;
while (node != null) {
Node<T> temp = node.left;
node.left = node.right;
node.right = temp;
node = node.left;
}
Node<T> temp = last;
last = first;
first = temp;
}
@Override
public Iterator<T> iterator() {
return new ListItr();
}
private class ListItr implements Iterator<T> {
private int count;
private Node<T> currentNode;
public ListItr() {
this.currentNode = first;
}
@Override
public boolean hasNext() {
return count < size;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
T item = currentNode.item;
currentNode = currentNode.right;
count++;
return item;
}
@Override
public void remove() {
currentNode.left.right = currentNode.right;
currentNode.right.left = currentNode.left;
}
}
public static void main(String[] args) {
ReverseDoublyLinkedList<Integer> foo = new ReverseDoublyLinkedList<Integer>();
foo.add(10);
foo.add(20);
foo.add(30);
foo.reverse();
Iterator<Integer> itr = foo.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
}
}
left
andright
that wouldn't be served better and more efficiently by simply having something like adirection
flag that's used by theIterator
? \$\endgroup\$ – Edward Jun 30 '14 at 20:38