package rene.util.list;
/**
* A class for a list of things. The list is forward and backward chained.
*
* @see rene.list.ListElement
*/
public class ListClass
{
ListElement First, Last; // Pointer to start and end of list.
/**
* Generate an empty list.
*/
public ListClass ()
{
First = null;
Last = null;
}
/**
* Append a node to the list
*/
public void append (ListElement l)
{
if (Last == null)
init(l);
else
{
Last.next(l);
l.previous(Last);
Last = l;
l.next(null);
l.list(this);
}
}
public void prepend (ListElement l)
// prepend a node to the list
{
if (First == null)
init(l);
else
{
First.previous(l);
l.next(First);
First = l;
l.previous(null);
l.list(this);
}
}
/*
* @param l ListElement to be inserted.
*
* @param after If null, it works like prepend.
*/
public void insert (ListElement l, ListElement after)
{
if (after == Last)
append(l);
else if (after == null)
prepend(l);
else
{
after.next().previous(l);
l.next(after.next());
after.next(l);
l.previous(after);
l.list(this);
}
}
/**
* initialize the list with a single element.
*/
public void init (ListElement l)
{
Last = First = l;
l.previous(null);
l.next(null);
l.list(this);
}
/**
* Remove a node from the list. The node really should be in the list, which
* is not checked.
*/
public void remove (ListElement l)
{
if (First == l)
{
First = l.next();
if (First != null)
First.previous(null);
else Last = null;
}
else if (Last == l)
{
Last = l.previous();
if (Last != null)
Last.next(null);
else First = null;
}
else
{
l.previous().next(l.next());
l.next().previous(l.previous());
}
l.next(null);
l.previous(null);
l.list(null);
}
/**
* Empty the list.
*/
public void removeall ()
{
First = null;
Last = null;
}
/** remove everything after e */
public void removeAfter (ListElement e)
{
e.next(null);
Last = e;
}
/**
* @return First ListElement.
*/
public ListElement first ()
{
return First;
}
/**
* @return Last ListElement.
*/
public ListElement last ()
{
return Last;
}
/**
* Prints the class
*/
@Override
public String toString ()
{
ListElement e = First;
String s = "";
while (e != null)
{
s = s + e.content().toString() + ", ";
e = e.next();
}
return s;
}
}