Wiederholung – Linked List Builder
Teil des Abschnitts Objektorientierte Programmierung der GO-Journey von Coddy — Lektion 24 von 107.
Aufgabe
EinfachLass uns eine verknüpfte Liste von Grund auf neu bauen! Du wirst eine Datenstruktur erstellen, bei der jeder Knoten auf den nächsten zeigt und so eine Kette von verbundenen Werten im Speicher bildet.
Du wirst deinen Code auf zwei Dateien verteilen:
linkedlist.go: Definiere einNode-Struct mit den FeldernValue(int) undNext(*Node). Erstelle einLinkedList-Struct, das einen Zeiger auf denHead-Knoten hält. Implementiere diese Methoden für*LinkedList:Append- fügt einen neuen Knoten mit dem angegebenen Wert am Ende der Liste hinzuPrepend- fügt einen neuen Knoten mit dem angegebenen Wert am Anfang der Liste hinzuPrint- durchläuft die Liste und gibt alle Werte getrennt durch->aus, endend mitnil
main.go: Lies Werte aus der Eingabe ein, baue eine verknüpfte Liste durch Anhängen (Append) und Voranstellen (Prepend) von Knoten auf und gib dann die finale Listenstruktur aus.
Die folgenden Eingaben werden bereitgestellt:
- Zeile 1: Erster Wert zum Anhängen
- Zeile 2: Zweiter Wert zum Anhängen
- Zeile 3: Wert zum Voranstellen
Deine Print-Methode sollte die Liste in diesem Format ausgeben:
[value1] -> [value2] -> [value3] -> nilZum Beispiel, gegeben 10, 20 und 5, sollte deine Ausgabe wie folgt aussehen:
5 -> 10 -> 20 -> nilDie Append-Methode muss bis zum Ende der Liste traversieren (dort, wo Next gleich nil ist), bevor der neue Knoten hinzugefügt wird. Die Prepend-Methode sollte einen neuen Knoten erstellen, dessen Next auf den aktuellen Head richten und dann den Head auf den neuen Knoten aktualisieren. Denke daran, dass eine leere Liste einen nil-Head hat, also 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 Go OOP
Externe DateienGo Workspace & ModulePackages & ImportsExportierte vs. nicht-exportierte NamenEinführung in OOP in GoStructs als KlassenMethoden für Structs definierenPointer- vs. Value-ReceiverStruct-InitialisierungKonstruktor-FunktionenZusammenfassung – Einfacher Taschenrechner4Interfaces
Einführung in InterfacesImplizite ImplementierungInterface als VertragLeeres Interface (any)Type AssertionType SwitchInterface-KompositionStringer & Error InterfacesRückblick - Formen-Rechner7Kapselung
Exportierte vs. nicht exportierte FelderKapselung auf Paket-EbeneGetter- & Setter-MethodenInformation Hiding in GoZusammenfassung - Studierendendatensätze10Generics (Go 1.18+)
Einführung in GenericsTypparameterType ConstraintsGenerische StructsWorkaround für generische MethodenZusammenfassung – Generische Collection2Vertiefung: Typen & Structs
Basis- & zusammengesetzte TypenBenutzerdefinierte TypdefinitionenStruct TagsAnonyme StructsVerschachtelte StructsZero Values & StandardwerteZusammenfassung - Kontaktbuch5Komposition statt Vererbung
Warum Go keine Vererbung hatGrundlagen des Struct EmbeddingMethod PromotionEinbetten mehrerer StructsEmbedding vs. AggregationShadowing eingebetteter MethodenZusammenfassung – Mitarbeiter-Hierarchie8Fehlerbehandlung & OOP
Das error-InterfaceEigene FehlertypenError Wrapping (fmt.Errorf)Sentinel-Fehlererrors.Is() und errors.As()Panic, Defer und RecoverZusammenfassung – Datei-Parser3Zeiger & Speicher
Zeiger-Grundlagen in GoZeiger auf StructsWertübergabe vs. ReferenzübergabeDie new() FunktionGarbage Collection in GoWiederholung – Linked List Builder6Polymorphismus in Go
Polymorphismus über InterfacesDuck Typing in GoInterface-ErfüllungsregelnPolymorphe CollectionsDependency InjectionZusammenfassung – Payment Processor9Nebenläufigkeit & OOP
Goroutines GrundlagenChannels & KommunikationGepufferte vs. ungepufferte ChannelsSelect-Anweisungsync.Mutex & sync.RWMutexsync.WaitGroupThread-sicheres Struct-DesignZusammenfassung - Worker Pool