package data.angelic;
public class LinkedList {
private Entry header;
private int size;
public LinkedList() {
super();
header = new Entry(null, null, null);
header.next = (header.previous = header);
size = 0;
}
public Object getFirst() { return header.next.element; }
public Object getLast() { return header.previous.element; }
public Object removeFirst() {
Object first = header.next.element;
this.remove(header.next);
return first;
}
public Object removeLast() {
Object last = header.previous.element;
this.remove(header.previous);
return last;
}
public void addFirst(Object o) { this.addBefore(o, header.next); }
public void addLast(Object o) { this.addBefore(o, header); }
public int size() { return size; }
public void add(Object o) { this.addBefore(o, header); }
private Entry addBefore(Object o, Entry e) {
Entry newEntry = new Entry(o, e, e.previous);
newEntry.previous.next = newEntry;
newEntry.next.previous = newEntry;
size++;
return newEntry;
}
private void remove(Entry e) {
e.previous.next = e.next;
e.next.previous = e.previous;
size--;
}
private static class Entry {
Object element;
Entry next;
Entry previous;
Entry(Object element, Entry next, Entry previous) {
super();
this.element = element;
this.next = next;
this.previous = previous;
}
}
}