Implementierung von verketteten Listen in Go
Daniel Hayes
Full-Stack Engineer · Leapcell

Key Takeaways
- Verkettete Listen in Go können von Grund auf neu implementiert werden, um ein tieferes Verständnis zu erlangen, oder durch Verwendung des Go-Pakets
container/list
. - Die manuelle Implementierung einer einfach verketteten Liste beinhaltet die Verwaltung von Knotenreferenzen für effizientes Einfügen und Löschen.
- Die Standardbibliothek von Go bietet eine doppelt verkettete Liste mit praktischen Methoden für gängige Operationen.
Eine verkettete Liste ist eine grundlegende Datenstruktur in der Informatik, bei der jedes Element, bekannt als Knoten, Daten und eine Referenz (oder einen Link) zum nächsten Knoten in der Sequenz enthält. Im Gegensatz zu Arrays speichern verkettete Listen Elemente nicht zusammenhängend im Speicher; stattdessen zeigt jeder Knoten auf den nächsten, was effiziente Einfüge- und Löschoperationen ermöglicht, ohne die gesamte Datenstruktur neu zu organisieren.
Arten von verketteten Listen
Es gibt verschiedene Variationen von verketteten Listen:
-
Einfach verkettete Liste: Jeder Knoten enthält Daten und eine Referenz zum nächsten Knoten.
-
Doppelt verkettete Liste: Jeder Knoten enthält Daten, eine Referenz zum nächsten Knoten und eine Referenz zum vorherigen Knoten.
-
Zirkulär verkettete Liste: Der letzte Knoten zeigt zurück zum ersten Knoten und bildet einen Kreis.
Implementieren einer einfach verketteten Liste in Go
Die Standardbibliothek von Go bietet ein container/list
-Paket, das eine doppelt verkettete Liste implementiert. Das Verständnis, wie man eine einfach verkettete Liste von Grund auf neu implementiert, kann jedoch tiefere Einblicke in Zeiger und Speicherverwaltung in Go ermöglichen.
Definieren der Knotenstruktur
Jeder Knoten in einer einfach verketteten Liste enthält einen Integer-Wert und eine Referenz zum nächsten Knoten:
type Node struct { data int next *Node }
Definieren der Struktur der verketteten Liste
Die verkettete Liste selbst verwaltet eine Referenz zum Kopfknoten und verfolgt ihre Länge:
type LinkedList struct { head *Node length int }
Einfügen am Kopf
So fügen Sie einen neuen Knoten am Anfang der Liste ein:
func (l *LinkedList) InsertAtHead(data int) { newNode := &Node{data: data, next: l.head} l.head = newNode l.length++ }
Einfügen am Ende
So fügen Sie einen neuen Knoten am Ende der Liste ein:
func (l *LinkedList) InsertAtTail(data int) { newNode := &Node{data: data} if l.head == nil { l.head = newNode } else { current := l.head for current.next != nil { current = current.next } current.next = newNode } l.length++ }
Löschen eines Knotens
So löschen Sie einen Knoten anhand seines Wertes:
func (l *LinkedList) Delete(data int) { if l.head == nil { return } if l.head.data == data { l.head = l.head.next l.length-- return } current := l.head for current.next != nil && current.next.data != data { current = current.next } if current.next != nil { current.next = current.next.next l.length-- } }
Durchlaufen der Liste
So durchlaufen und drucken Sie die Liste:
func (l *LinkedList) PrintList() { current := l.head for current != nil { fmt.Println(current.data) current = current.next } }
Verwenden des container/list
-Pakets von Go
Für praktische Anwendungen bietet das container/list
-Paket von Go eine robuste Implementierung einer doppelt verketteten Liste:
package main import ( "container/list" "fmt" ) func main() { l := list.New() l.PushBack(1) l.PushBack(2) l.PushFront(0) for e := l.Front(); e != nil; e = e.Next() { fmt.Println(e.Value) } }
Dies wird ausgeben:
0
1
2
Das container/list
-Paket bietet eine gebrauchsfertige, doppelt verkettete Liste, die für bestimmte Operationen aufgrund ihrer bidirektionalen Durchlaufeigenschaften effizienter sein kann.
Fazit
Das Implementieren von verketteten Listen in Go bietet wertvolle Erfahrungen mit Zeigern und dynamischen Datenstrukturen. Während die Standardbibliothek von Go über das container/list
-Paket eine doppelt verkettete Liste anbietet, stattet das Verständnis der zugrunde liegenden Implementierungsdetails Entwickler mit dem Wissen aus, fundierte Entscheidungen darüber zu treffen, wann und wie solche Datenstrukturen effektiv eingesetzt werden können.
FAQs
Verkettete Listen bieten effiziente Einfügungen und Löschungen, ohne Speicher neu zuzuweisen.
Erstellen Sie einen neuen Knoten, verweisen Sie mit seinem next
auf den aktuellen Kopf und aktualisieren Sie den Kopf auf den neuen Knoten.
Wenn Sie eine robuste, integrierte doppelt verkettete Liste mit vereinfachten Operationen benötigen.
Wir sind Leapcell, Ihre erste Wahl für das Hosting von Go-Projekten.
Leapcell ist die Serverlose Plattform der nächsten Generation für Webhosting, asynchrone Aufgaben und Redis:
Multi-Sprachen-Unterstützung
- Entwickeln Sie mit Node.js, Python, Go oder Rust.
Stellen Sie unbegrenzt Projekte kostenlos bereit
- zahlen Sie nur für die Nutzung – keine Anfragen, keine Gebühren.
Unschlagbare Kosteneffizienz
- Pay-as-you-go ohne Leerlaufgebühren.
- Beispiel: 25 $ unterstützen 6,94 Millionen Anfragen bei einer durchschnittlichen Antwortzeit von 60 ms.
Optimierte Entwicklererfahrung
- Intuitive Benutzeroberfläche für mühelose Einrichtung.
- Vollständig automatisierte CI/CD-Pipelines und GitOps-Integration.
- Echtzeitmetriken und Protokollierung für umsetzbare Erkenntnisse.
Mühelose Skalierbarkeit und hohe Leistung
- Automatische Skalierung zur einfachen Bewältigung hoher Parallelität.
- Kein Betriebsaufwand – konzentrieren Sie sich einfach auf das Bauen.
Erfahren Sie mehr in der Dokumentation!
Folgen Sie uns auf X: @LeapcellHQ