Rückblick – Verkettete Liste erstellen
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy. Lektion 24 von 107.
Aufgabe
EinfachErstellen wir eine verkettete Liste von Grund auf! Du erstellst eine Datenstruktur, bei der jeder Knoten auf den nächsten zeigt und so eine Kette verbundener Werte im Speicher bildet.
Du organisierst deinen Code über zwei Dateien:
linkedlist.go: Definiere eineNode-Struktur mit den FeldernValue(int) undNext(*Node). Erstelle eineLinkedList-Struktur, die einen Zeiger auf denHead-Knoten enthält. Implementiere diese Methoden für*LinkedList:Append– fügt am Ende der Liste einen neuen Knoten mit dem angegebenen Wert hinzuPrepend– fügt am Anfang der Liste einen neuen Knoten mit dem angegebenen Wert hinzuPrint– durchläuft die Liste und gibt alle Werte, getrennt durch->, aus und beendet die Ausgabe mitnil
main.go: Lies Werte aus der Eingabe, erstelle durch Anhängen und Voranstellen von Knoten eine verkettete Liste und gib anschließend die endgültige Listenstruktur aus.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Erster anzuhängender Wert
- Zeile 2: Zweiter anzuhängender Wert
- Zeile 3: Voranzustellender Wert
Deine Print-Methode sollte die Liste in diesem Format ausgeben:
[value1] -> [value2] -> [value3] -> nilWenn beispielsweise 10, 20 und 5 gegeben sind, sollte deine Ausgabe folgendermaßen aussehen:
5 -> 10 -> 20 -> nilDie Methode Append muss bis zum Ende der Liste durchlaufen (wo Next nil ist), bevor sie den neuen Knoten hinzufügt. Die Methode Prepend sollte einen neuen Knoten erstellen, dessen Next auf den aktuellen Kopf zeigen lassen und anschließend den Kopf auf den neuen Knoten aktualisieren. Denke daran, dass eine leere Liste einen nil-Kopf hat, und behandle diesen Fall in deiner Append-Methode.
Probier es selbst
package main
import "fmt"
func main() {
// Eingabewerte lesen
var val1, val2, val3 int
fmt.Scanln(&val1)
fmt.Scanln(&val2)
fmt.Scanln(&val3)
// Eine neue verknüpfte Liste erstellen
list := &LinkedList{}
// TODO: Append verwenden, um val1 und val2 zur Liste hinzuzufügen
// TODO: Prepend verwenden, um val3 am Anfang der Liste hinzuzufügen
// TODO: Die finale Listenstruktur ausgeben
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP in Go
Externe DateienGo-Workspace & ModulePackages & ImportsExportierte vs. nicht exportierte NamenEinführung in OOP mit GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktorfunktionenRückblick – Einfacher Taschenrechner4Schnittstellen
Einführung in SchnittstellenImplizite ImplementierungSchnittstelle als VertragLeere Schnittstelle (any)TypzusicherungTypwechselZusammensetzung von SchnittstellenStringer- und Error-SchnittstellenRückblick – Formenrechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf PaketebeneGetter- und Setter-MethodenInformationsverbergung in GoRückblick – Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterTypbeschränkungenGenerische StrukturenWorkaround für generische MethodenZusammenfassung – Generische Sammlung2Typen & Structs im Detail
Grundlegende & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct-TagsAnonyme StructsVerschachtelte StructsNullwerte & StandardwerteRückblick – Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen der Struct-EinbettungMethoden-PromotionMehrere Structs einbettenEinbettung vs. AggregationVerbergen eingebetteter MethodenRückblick – Mitarbeiterhierarchie8Fehlerbehandlung & OOP
Das Error-InterfaceBenutzerdefinierte FehlertypenError-Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverRückblick – Dateiparser3Zeiger & Speicher
Grundlagen von Zeigern in GoZeiger auf StructsÜbergabe per Wert vs. ReferenzDie Funktion new()Garbage Collection in GoRückblick – Verkettete Liste erstellen6Polymorphismus in Go
Polymorphismus über InterfacesDuck-Typing in GoRegeln zur Interface-ErfüllungPolymorphe SammlungenDependency InjectionZusammenfassung – Zahlungsprozessor9Konkurrenz & OOP
Grundlagen der GoroutinesChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignRückblick – Worker PoolÜbe selbstständig: Online-Go-Compiler