Maison > développement back-end > Golang > golang implémente une liste doublement chaînée

golang implémente une liste doublement chaînée

王林
Libérer: 2023-05-10 22:37:37
original
626 Les gens l'ont consulté

La liste doublement chaînée est une structure de données couramment utilisée qui nous permet d'effectuer des opérations d'insertion, de suppression ou de requête à n'importe quelle position de la liste chaînée dans une complexité temporelle O(1).

L'implémentation d'une liste doublement chaînée dans Golang nécessite l'utilisation de pointeurs, car tous les types dans Golang sont des types valeur et les données d'origine ne peuvent pas être modifiées directement. Grâce aux pointeurs, nous pouvons facilement modifier et transférer des valeurs, réalisant ainsi le fonctionnement de listes doublement chaînées.

Ce qui suit est une simple implémentation Golang d'une liste doublement chaînée :

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()
}
Copier après la connexion

Dans le code ci-dessus, nous définissons d'abord une structure Node, qui contient les informations requises pour chaque nœud de la liste chaînée Trois données : données, précédent et suivant. Parmi eux, data stocke la valeur du nœud, previous stocke l'adresse du nœud précédent et next stocke l'adresse du nœud suivant . Node 结构体,该结构体包含链表中的每个节点所需的三个数据:datapreviousnext。其中,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()
}
Copier après la connexion

在定义了这几个方法后,我们可以在 main 函数中实例化一个链表对象并进行操作:

func main() {
    list := LinkedList{}

    list.insertAtEnd(1)
    list.insertAtEnd(2)
    list.insertAtEnd(3)
    list.insertAtBeginning(4)

    list.display()

    list.delete(3)

    list.display()
}
Copier après la connexion

在上面的代码中,我们首先实例化了一个 LinkedList 对象 list,然后我们按顺序插入了四个元素:1、2、3 和 4。我们在第一次调用 display 方法时,将输出链表的内容:

4 1 2 3
Copier après la connexion

接着,我们删除了元素 3,并再次调用 display

Ensuite, nous définissons une structure LinkedList pour représenter l'intégralité de la liste chaînée. Cette structure contient le pointeur de tête head et le pointeur de queue tail de la liste chaînée.

Voici plusieurs méthodes nécessaires pour implémenter une liste doublement chaînée : 🎜
4 1 2
Copier après la connexion
🎜Après avoir défini ces méthodes, nous pouvons instancier un objet de liste chaînée dans la fonction main et effectuer des opérations : 🎜rrreee 🎜Dans le au-dessus du code, nous instancions d'abord un objet LinkedList list, puis nous insérons quatre éléments dans l'ordre : 1, 2, 3 et 4. Lorsque nous appellerons la méthode display pour la première fois, nous afficherons le contenu de la liste chaînée : 🎜rrreee🎜Ensuite, nous supprimons l'élément 3 et appelons à nouveau la méthode display pour afficher le contenu de la liste chaînée Dernier contenu : 🎜rrreee🎜Cette simple implémentation Golang d'une liste doublement chaînée montre comment utiliser des pointeurs pour créer et modifier des listes chaînées, et comment implémenter des opérations telles que l'insertion, la suppression et l'interrogation de listes chaînées . Si vous devez utiliser des listes doublement liées pour créer des structures de données efficaces, veuillez vous référer au code ci-dessus pour savoir comment implémenter des listes doublement liées dans Golang. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal