package org.exist.util;
/* eXist Native XML Database
* Copyright (C) 2001, Wolfgang M. Meier (meier@ifs.tu-darmstadt.de)
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* $Id$
*/
import java.util.Iterator;
import org.apache.log4j.Logger;
public class OrderedLinkedList {
private final static Logger LOG = Logger.getLogger(OrderedLinkedList.class);
public abstract static class Node {
Node next = null;
Node prev = null;
public Node() {
}
public Node getNextNode() { return next; }
public Node getPrevNode() { return prev; }
public abstract int compareTo(Node other);
public abstract boolean equals(Node other);
}
public static class SimpleNode extends Node {
Comparable data;
public SimpleNode(Comparable data) {
this.data = data;
}
public int compareTo(Node other) {
final SimpleNode o = (SimpleNode)other;
return data.compareTo(o.data);
}
public boolean equals(Node other) {
return ((SimpleNode)other).data.equals(data);
}
public Comparable getData() {
return data;
}
}
protected Node header = null;
protected Node last = null;
private int size = 0;
public OrderedLinkedList() {
}
public Node add(Node newNode) {
newNode.next = null;
newNode.prev = null;
size++;
if (header == null) {
header = newNode;
last = header;
return header;
}
Node node = header;
while (newNode.compareTo(node) > 0) {
if (node.next == null) {
// append to end of list
node.next = newNode;
newNode.prev = node;
last = newNode;
return newNode;
}
node = node.next;
}
// insert node
newNode.prev = node.prev;
if (newNode.prev != null)
newNode.prev.next = newNode;
node.prev = newNode;
newNode.next = node;
if (node == header)
header = newNode;
return newNode;
}
public void remove(Node n) {
Node node = header;
while (node != null) {
if (node.equals(n)) {
removeNode(n);
return;
}
node = node.next;
}
}
public void removeNode(Node node) {
--size;
if (node.prev == null) {
if (node.next != null) {
node.next.prev = null;
header = node.next;
} else
header = null;
} else {
node.prev.next = node.next;
if (node.next != null)
node.next.prev = node.prev;
else
last = node.prev;
}
}
public Node removeFirst() {
Node node = header;
header = node.next;
if(header != null)
header.prev = null;
--size;
return node;
}
public Node removeLast() {
Node node = last;
last = node.prev;
last.next = null;
--size;
return node;
}
public Node getLast() {
return last == null ? null : last;
}
public Node get(int pos) {
Node node = header;
int count = 0;
while (node != null) {
if (count++ == pos)
return node;
node = node.next;
}
return null;
}
public Node[] getData() {
Node[] data = new Node[size];
Node next = header;
int i = 0;
while( next != null ) {
data[i++] = next;
next = next.next;
}
return data;
}
public Node[] toArray(Node[] data) {
Node next = header;
int i = 0;
while( next != null ) {
data[i++] = next;
next = next.next;
}
return data;
}
public boolean contains(Node c) {
Node next = header;
while( next != null ) {
if(next.equals(c))
return true;
next = next.next;
}
return false;
}
public int size() {
return size;
}
public void reset() {
header = null;
last = null;
size = 0;
}
public Iterator iterator() {
return new OrderedListIterator(header);
}
private final static class OrderedListIterator implements Iterator {
private Node next;
public OrderedListIterator(Node header) {
this.next = header;
}
public boolean hasNext() {
return (next != null);
}
public Object next() {
if (next == null)
return null;
final Node current = next;
next = next.next;
return current;
}
public void remove() {
throw new RuntimeException("not implemented");
}
}
public static void main(String args[]) {
OrderedLinkedList list = new OrderedLinkedList();
list.add(new SimpleNode("Adam"));
list.add(new SimpleNode("Sabine"));
list.add(new SimpleNode("Georg"));
list.add(new SimpleNode("Henry"));
list.add(new SimpleNode("Achim"));
list.add(new SimpleNode("Franz"));
list.add(new SimpleNode("Doris"));
list.add(new SimpleNode("Rudi"));
list.add(new SimpleNode("Hermann"));
list.add(new SimpleNode("Lisa"));
list.add(new SimpleNode("Xaver"));
list.add(new SimpleNode("Reinhard"));
list.add(new SimpleNode("Ludwig"));
list.remove(new SimpleNode("Lisa"));
list.remove(new SimpleNode("Henry"));
for(int i = 0; i < list.size(); i++)
System.out.println(((SimpleNode)list.get(i)).data);
}
}