Golang implementiert eine doppelt verknüpfte Liste
Doppelt verknüpfte Listen sind eine häufig verwendete Datenstruktur, die es uns ermöglicht, Einfügungs-, Lösch- oder Abfragevorgänge an jeder Position in der verknüpften Liste innerhalb der Zeitkomplexität von O(1) durchzuführen.
Die Implementierung einer doppelt verknüpften Liste in Golang erfordert die Verwendung von Zeigern, da alle Typen in Golang Werttypen sind und die Originaldaten nicht direkt geändert werden können. Durch Zeiger können wir Werte leicht ändern und übertragen und so die Funktionsweise doppelt verknüpfter Listen realisieren.
Das Folgende ist eine einfache Golang-Implementierung einer doppelt verknüpften Liste:
package main import "fmt" type Node struct { data int previous *Node next *Node } type LinkedList struct { head *Node tail *Node } func (list *LinkedList) insertAtBeginning(data int) { newNode := &Node{ data: data, previous: nil, next: nil, } if list.head == nil { list.head = newNode list.tail = newNode return } newNode.next = list.head list.head.previous = newNode list.head = newNode } func (list *LinkedList) insertAtEnd(data int) { newNode := &Node{ data: data, previous: nil, next: nil, } if list.tail == nil { list.head = newNode list.tail = newNode return } newNode.previous = list.tail list.tail.next = newNode list.tail = newNode } func (list *LinkedList) delete(data int) bool { currentNode := list.head for currentNode != nil { if currentNode.data == data { if currentNode == list.head { list.head = currentNode.next list.head.previous = nil } else if currentNode == list.tail { list.tail = currentNode.previous list.tail.next = nil } else { currentNode.previous.next = currentNode.next currentNode.next.previous = currentNode.previous } return true } currentNode = currentNode.next } return false } func (list *LinkedList) display() { currentNode := list.head for currentNode != nil { fmt.Printf("%d ", currentNode.data) currentNode = currentNode.next } fmt.Println() } func main() { list := LinkedList{} list.insertAtEnd(1) list.insertAtEnd(2) list.insertAtEnd(3) list.insertAtBeginning(4) list.display() list.delete(3) list.display() }
Im obigen Code definieren wir zunächst eine Node
-Struktur, die die für jeden Knoten in der verknüpften Liste Drei erforderlichen Informationen enthält Daten: data
, previous
und next
. Unter diesen speichert data
den Wert des Knotens, previous
speichert die Adresse des vorherigen Knotens und next
speichert die Adresse des nächsten Knotens . Node
结构体,该结构体包含链表中的每个节点所需的三个数据:data
、previous
和 next
。其中,data
存储节点的值,previous
存储上一个节点的地址,next
存储下一个节点的地址。
然后,我们定义了一个 LinkedList
结构体来表示整个链表。该结构体包含链表的头指针 head
和尾指针 tail
。
下面是实现双向链表所需的几个方法:
// 在链表头部插入一个元素 func (list *LinkedList) insertAtBeginning(data int) { newNode := &Node{ data: data, previous: nil, next: nil, } if list.head == nil { list.head = newNode list.tail = newNode return } newNode.next = list.head list.head.previous = newNode list.head = newNode } // 在链表尾部插入一个元素 func (list *LinkedList) insertAtEnd(data int) { newNode := &Node{ data: data, previous: nil, next: nil, } if list.tail == nil { list.head = newNode list.tail = newNode return } newNode.previous = list.tail list.tail.next = newNode list.tail = newNode } // 删除链表中指定的元素 func (list *LinkedList) delete(data int) bool { currentNode := list.head for currentNode != nil { if currentNode.data == data { if currentNode == list.head { list.head = currentNode.next list.head.previous = nil } else if currentNode == list.tail { list.tail = currentNode.previous list.tail.next = nil } else { currentNode.previous.next = currentNode.next currentNode.next.previous = currentNode.previous } return true } currentNode = currentNode.next } return false } // 打印链表的所有元素 func (list *LinkedList) display() { currentNode := list.head for currentNode != nil { fmt.Printf("%d ", currentNode.data) currentNode = currentNode.next } fmt.Println() }
在定义了这几个方法后,我们可以在 main
函数中实例化一个链表对象并进行操作:
func main() { list := LinkedList{} list.insertAtEnd(1) list.insertAtEnd(2) list.insertAtEnd(3) list.insertAtBeginning(4) list.display() list.delete(3) list.display() }
在上面的代码中,我们首先实例化了一个 LinkedList
对象 list
,然后我们按顺序插入了四个元素:1、2、3 和 4。我们在第一次调用 display
方法时,将输出链表的内容:
4 1 2 3
接着,我们删除了元素 3,并再次调用 display
LinkedList
-Struktur, um die gesamte verknüpfte Liste darzustellen. Diese Struktur enthält den Kopfzeiger head
und den Schwanzzeiger tail
der verknüpften Liste. Die folgenden Methoden sind zum Implementieren einer doppelt verknüpften Liste erforderlich: 🎜4 1 2
main
instanziieren und Operationen ausführen: 🎜rrreee 🎜In der Im obigen Code instanziieren wir zunächst ein LinkedList
-Objekt list
und fügen dann vier Elemente in der Reihenfolge ein: 1, 2, 3 und 4. Wenn wir die Methode display
zum ersten Mal aufrufen, geben wir den Inhalt der verknüpften Liste aus: 🎜rrreee🎜Dann löschen wir Element 3 und rufen die Methode display
erneut auf um den Inhalt der verknüpften Liste auszugeben Neuester Inhalt: 🎜rrreee🎜Diese einfache Golang-Implementierung einer doppelt verknüpften Liste zeigt, wie Zeiger zum Erstellen und Ändern verknüpfter Listen verwendet werden und wie Vorgänge wie Einfügen, Löschen und Abfragen verknüpfter Listen implementiert werden . Wenn Sie doppelt verknüpfte Listen verwenden müssen, um effiziente Datenstrukturen zu erstellen, lesen Sie bitte den obigen Code, um zu erfahren, wie Sie doppelt verknüpfte Listen in Golang implementieren. 🎜Das obige ist der detaillierte Inhalt vonGolang implementiert eine doppelt verknüpfte Liste. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



OpenSSL bietet als Open -Source -Bibliothek, die in der sicheren Kommunikation weit verbreitet sind, Verschlüsselungsalgorithmen, Tasten und Zertifikatverwaltungsfunktionen. In seiner historischen Version sind jedoch einige Sicherheitslücken bekannt, von denen einige äußerst schädlich sind. Dieser Artikel konzentriert sich auf gemeinsame Schwachstellen und Antwortmaßnahmen für OpenSSL in Debian -Systemen. DebianopensL Bekannte Schwachstellen: OpenSSL hat mehrere schwerwiegende Schwachstellen erlebt, wie z. Ein Angreifer kann diese Sicherheitsanfälligkeit für nicht autorisierte Lesen sensibler Informationen auf dem Server verwenden, einschließlich Verschlüsselungsschlüssel usw.

In dem Artikel wird erläutert, wie das PPROF -Tool zur Analyse der GO -Leistung verwendet wird, einschließlich der Aktivierung des Profils, des Sammelns von Daten und der Identifizierung gängiger Engpässe wie CPU- und Speicherprobleme.Character Count: 159

In dem Artikel werden Schreiben von Unit -Tests in GO erörtert, die Best Practices, Spottechniken und Tools für ein effizientes Testmanagement abdecken.

Das Problem der Warteschlange Threading In Go Crawler Colly untersucht das Problem der Verwendung der Colly Crawler Library in Go -Sprache. Entwickler stoßen häufig auf Probleme mit Threads und Anfordern von Warteschlangen. � ...

In der Bibliothek, die für den Betrieb der Schwimmpunktnummer in der GO-Sprache verwendet wird, wird die Genauigkeit sichergestellt, wie die Genauigkeit ...

Backend Learning Path: Die Erkundungsreise von Front-End zu Back-End als Back-End-Anfänger, der sich von der Front-End-Entwicklung verwandelt, Sie haben bereits die Grundlage von Nodejs, ...

Wie kann man im Beegoorm -Framework die mit dem Modell zugeordnete Datenbank angeben? In vielen BeEGO -Projekten müssen mehrere Datenbanken gleichzeitig betrieben werden. Bei Verwendung von BeEGO ...

In dem Artikel werden die Verwaltungs -Go -Modulabhängigkeiten über Go.mod erörtert, die Spezifikationen, Aktualisierungen und Konfliktlösung abdecken. Es betont Best Practices wie semantische Versioning und reguläre Updates.
