Ist zwar schon lange her, dass ich was mit verketteten Listen gemacht habe, aber ich versuche trotzdem mal eine Erklärung:
Eine verkettete Liste besteht im Allgemeinen aus Strukturen (Records), die als ein Element 1 (einfach verkettete Liste) oder 2 (doppelt verkettete Liste) Zeiger auf einen Record ihres eigenen Typs beinhalten. Ich nenne diese jetzt mal Navigationszeiger. Das sähe dann etwa so aus:
Delphi-Quellcode:
type PMyRecord = ^TMyRecord;
TMyRecord = record
Next: PMyRecord; //Navigationszeiger auf das nächste Element der Liste
Prev: PMyRecord; //bei einer doppelt verketteten Liste Navigationszeiger auf das Vorgängerelement
... //Nutzdaten
end;
Bei einer einfach verketteten Liste hat das letzte Element im Feld Next den Wert nil stehen, um das Ende der Liste zu kennzeichnen. Bei einer doppelt verketteten Liste hat das erste Element im Feld Prev nil stehen. Um nun ein Element aus der Liste zu löschen, musst Du dessen Navigationszeiger auf den seines Nachfolgers bzw. Vorgängers setzen, um die Kette nicht zu unterbrechen. Anschließend kannst Du den Speicher des Elements freigeben. Dazu sicherst Du Dir den Zeiger auf das zu löschende Element, biegst diesen auf dessen Nachfolger um und räumst auf.
Delphi-Quellcode:
//Beispiel mit einer einfach verketteten Liste
//ich gehe davon aus, dass Du in einer while-Schleife durch die Elemente iterierst
if Assigned(Element^.Next) and (Element^.Next^.Daten = Kriterium) then //es handelt sich um den Nachfolger des aktuellen Elements
begin
tmp := Element^.Next; //alten Zeiger merken
Element^.Next := tmp^.Next; //Navigationszeiger um eine Position weiter verschieben
Dispose(tmp); //Speicher freigeben
end
Das kann man auch schön grafisch darstellen, dann fällt einem das Verständnis leichter.