Datenstrukturen und Algorithmen
Website: | Hamburg Open Online University |
Kurs: | Programmieren mit Java |
Buch: | Datenstrukturen und Algorithmen |
Gedruckt von: | Gast |
Datum: | Donnerstag, 21. November 2024, 14:35 |
Beschreibung
Hier gibt es einen Einstieg in die beiden Themen mit eigener Implementierung einer Single Linked List.
Single Linked List
Klassen als Datenstruktur
public class SingleLinkedList { public SingleLinkedList next; public String data; }
public class SingleLinkedList { public SingleLinkedList next; public String data; public static void main(String[] args) throws Exception { // unsere Liste SingleLinkedList planeten = null; } }
Die Grundfunktionen einer Liste
Elemente hinzufügen
public static SingleLinkedList wertHinzufuegen(SingleLinkedList liste, String data) { // null soll nicht in der Liste vorkommen if(data == null) { return liste; } // Neuen Eintrag erstellen und Daten einfügen SingleLinkedList eintrag = new SingleLinkedList(); eintrag.data = data; // Bei einer leeren Liste, wird eine neue Liste begonnen if(liste == null) { return eintrag; } // Wir suchen das Ende der Liste SingleLinkedList position = liste; while(position.next != null) { position = position.next; } // Eintrag am Ende anhängen position.next = eintrag; // Verweis auf Liste zurückgeben return liste; }
public static void main(String[] args) throws Exception { // unsere Liste SingleLinkedList planeten = null; planeten = wertHinzufuegen(planeten, "Merkur"); planeten = wertHinzufuegen(planeten, "Venus"); planeten = wertHinzufuegen(planeten, "Erde"); planeten = wertHinzufuegen(planeten, "Mars"); planeten = wertHinzufuegen(planeten, "Jupiter"); planeten = wertHinzufuegen(planeten, "Saturn"); planeten = wertHinzufuegen(planeten, "Uranus"); planeten = wertHinzufuegen(planeten, "Neptun"); planeten = wertHinzufuegen(planeten, "Pluto"); }
Liste ausgeben
public static void listeAusgeben(SingleLinkedList liste) { // Leere Liste erkennen und danach stoppen if(liste == null) { System.out.println("SingleLinkedList()"); return; } // Listenanfang ausgeben System.out.print("SingleLinkedList(" + liste.data); // Liste durchlaufen while(liste.next != null) { liste = liste.next; System.out.print(", " + liste.data); } // Listenende ausgeben System.out.println(")"); }
Wir müssen wieder den Sonderfall der leeren Liste zu Beginn prüfen und gegebenen Falls abbrechen. Danach können wir den Listenanfang und jedes weiter Element ausgeben. Hierfür eignet sich die System.out.print() Methode, da sie keinen Zeilenumbruch am Ende ausgibt.
Länge ermitteln
public static int laenge(SingleLinkedList liste) { // Leere Liste erkennen und danach stoppen if(liste == null) { return 0; } // Elemente zählen int laenge = 1; while(liste.next != null) { liste = liste.next; laenge ++; } return laenge; }
Elemente finden
Für die Suche von Einträgen, in unserer Liste wollen, wir definieren,
dass die Methode “suche” als Parameter die Liste und einen String, der
gesucht werden soll, übergeben bekommt. Als Rückgabe erwarten wir den
Wert -1 wenn der Wert nicht enthalten ist und sonst die Position. Wie
bei Arrays soll das erste Element die Position 0 haben.
public static int suche(SingleLinkedList liste, String suchwort) { // Leere Liste erkennen und danach stoppen if(liste == null) { return -1; } // Leres Suchwort behandeln if(suchwort == null) { return -1; } // Element suchen int position = 0; while(liste.next != null) { if(suchwort.equals(liste.data)) { return position; } liste = liste.next; position ++; } return -1; }
Wir prüfen wieder als Erstes ab, dass keiner der Parameter null ist. Falls doch wird die Liste unverändert zurückgegeben. Als Nächstes behandeln wir den Sonderfall, dass der Wert vom Anfang der Liste entfernt werden muss. Hier reicht es den hinteren Teil der Liste zurück zu geben.
Am darauf folgenden Abschnitt wird nach dem Wert gesucht, der entfernt werden soll. Leider kann man in dieser Datenstruktur nur vorwärts laufen und man benötigt den Vorgänger eines Elements um das Element zu entfernen. Darum wird immer geprüft, ob das nächste Element den gesuchten Wert hat. Wenn ja, wird dessen Nachfolger als Nachfolger des aktuellen Elements gesetzt. Hierdurch fällt der Wert aus der Liste heraus.
Iterativ vs Rekursiv
public static int laenge(SingleLinkedList liste) { // Leere Liste erkennen und danach stoppen if(liste == null) { return 0; } // Elemente zählen int laenge = 1; while(liste.next != null) { liste = liste.next; laenge ++; } return laenge; }
public static int laenge(SingleLinkedList liste) { if(liste == null) { return 0; } else { return laenge(liste.next) + 1; } }