/******************************************************************************
* Copyright (c) 2009 - 2015 IBM Corporation.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*****************************************************************************/
package data.angelic;
public class LinkedList {
private Entry header;
private int size;
/**
* Constructs an empty list.
*/
public LinkedList() {
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;
remove(header.next);
return first;
}
public Object removeLast() {
Object last = header.previous.element;
remove(header.previous);
return last;
}
public void addFirst(Object o) {
addBefore(o, header.next);
}
public void addLast(Object o) {
addBefore(o, header);
}
public int size() {
return size;
}
public void add(Object o) {
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) {
this.element = element;
this.next = next;
this.previous = previous;
}
}
}