Rumah  >  Artikel  >  pembangunan bahagian belakang  >  golang melaksanakan senarai berganda

golang melaksanakan senarai berganda

王林
王林asal
2023-05-10 22:37:37613semak imbas

Senarai terpaut dua kali ialah struktur data yang biasa digunakan yang membolehkan kami melakukan operasi pemadaman, pemadaman atau pertanyaan di mana-mana kedudukan dalam senarai terpaut dalam kerumitan masa O(1).

Melaksanakan senarai pautan berganda di Golang memerlukan penggunaan penunjuk, kerana semua jenis dalam Golang adalah jenis nilai dan data asal tidak boleh diubah suai secara langsung. Melalui petunjuk, kami boleh mengubah suai dan memindahkan nilai dengan mudah, dengan itu merealisasikan operasi senarai berganda.

Berikut ialah pelaksanaan Golang mudah bagi senarai terpaut dua kali:

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()
}

Dalam kod di atas, kami mula-mula mentakrifkan struktur Node, yang mengandungi setiap elemen dalam senarai terpaut Tiga data diperlukan oleh nod: data, previous dan next. Antaranya, data menyimpan nilai nod, previous menyimpan alamat nod sebelumnya dan next menyimpan alamat nod seterusnya.

Kemudian, kami mentakrifkan struktur LinkedList untuk mewakili keseluruhan senarai terpaut. Struktur ini mengandungi penuding kepala head dan penuding ekor tail senarai terpaut.

Berikut adalah beberapa kaedah yang diperlukan untuk melaksanakan senarai terpaut dua kali:

// 在链表头部插入一个元素
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()
}

Selepas mentakrifkan kaedah ini, kami boleh membuat instantiate objek senarai terpaut dalam fungsi main dan melaksanakan operasi :

func main() {
    list := LinkedList{}

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

    list.display()

    list.delete(3)

    list.display()
}

Dalam kod di atas, kita mula-mula membuat instantiate LinkedList objeklist, dan kemudian kita masukkan empat elemen mengikut tertib: 1, 2, 3 dan 4. Apabila kami memanggil kaedah display buat kali pertama, kami akan mengeluarkan kandungan senarai terpaut:

4 1 2 3

Kemudian, kami memadamkan elemen 3 dan memanggil kaedah display sekali lagi untuk mengeluarkan kandungan terkini senarai terpaut:

4 1 2

Pelaksanaan Golang ringkas bagi senarai terpaut dua kali ini menunjukkan cara menggunakan penunjuk untuk mencipta dan mengubah suai senarai terpaut dan cara melaksanakan operasi seperti pemasukan, pemadaman dan pertanyaan senarai terpaut. Jika anda perlu menggunakan senarai terpaut dua kali untuk mencipta struktur data yang cekap, sila rujuk kod di atas untuk mengetahui cara melaksanakan senarai terpaut dua kali di Golang.

Atas ialah kandungan terperinci golang melaksanakan senarai berganda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:pemasangan dan pengujian golangArtikel seterusnya:pemasangan dan pengujian golang