D
wir sollten ne doppelt verkettete liste schreiben, u.a. mit ner inneren Klasse, die man nutzt um ein Elemenet zu erstellen, welches auch gleichzeitig auf seinen vorgänge rund Nachfolger zeigt.
Soweit zu gut alles, das meiste bisher geht auch, nur folgende komische Situation nicht:
Wenn ich folgende Elemente in der Liste habe:
a
b
c
d
dann kann ich problem los mit meiner insertAfter Methode, nach b z.b. "bb" was einfügen, die Liste ausgeben lasen, das letzte Element löschen lassen, wieder ausgeben lassen, dann steht korrekt
a
b
bb
c
da.
(Nach dem letzten Element einfügen kann noch nicht klappen bei mir), jedoch wenn ich von meiner ausgangsliste nach c, also dem vorletzten Element etwas einfüge, und die liste ausgebe, ist es zunächst korrekt, doch wenn ich dann das letzte element löschen lassen, werden die letzten beiden, also das vona nfang an letzte, und das eingefügte element gelöscht.
Ich weiss absolut nicht wo der fehler liegt, vllt. findet ihn ja jemand.
Hier die relevanten programmierteile:
public class DoubleLinkedList implements IDoubleLinkedList{
ListElement start; // The start of the double linked list
ListElement end; // The end of the double linked list
ListElement help; // an element used for insertions
// innere Klasse:
public class ListElement
{
ListElement before; // The Element of the List BEFORE this one
ListElement after; // The Element of the List AFTER this one
Object entry; // The entry wich is saved in each List Element
/**
* The constructor with a parameter
* @param newEntry The entry wich is to be saved in the element
*/
ListElement(Object newEntry)
{
entry = newEntry;
}
}
public void insertAfter(Object after, Object anObject)
{
if(anObject == null || after == null)
throw new IllegalArgumentException("Es wird kein Object übergeben");
ListElement element = new ListElement(anObject);
ListElement search = start;
while(search.entry != after || search == end)
{
search = search.after;
}
help = search;
element.after = search.after;
element.before = search;
search.after = element;
help.after.before = element;
}
public Object removeLast()
{
if(start == null)
throw new NullPointerException("Die Liste ist leer.");
help = end;
end = end.before;
end.after = start;
return help;
}
public void output()
{
if(start == null)
System.out.println("Die Liste ist leer.");
else
{
ListElement outputElement;
outputElement = start;
do
{
System.out.println(outputElement.entry);
outputElement = outputElement.after;
}
while(outputElement != end.after);
}