Table of Contents
Definition of singly linked list
Node definition of a singly linked list
Initialization of singly linked list
Insertion operation of singly linked list
Singly linked list deletion operation
Singly linked list traversal operation
Sample code
Home Backend Development Golang Go Language Programming Guide: Detailed Explanation of Single Linked List Implementation

Go Language Programming Guide: Detailed Explanation of Single Linked List Implementation

Mar 22, 2024 pm 05:18 PM
go language accomplish Single list

Go Language Programming Guide: Detailed Explanation of Single Linked List Implementation

Go Language Programming Guide: Detailed Explanation of Single Linked List Implementation

In Go language, singly linked list is a common data structure used to store a series of elements and Sequential access. This article will introduce the implementation principle of singly linked list in detail and give specific Go language code examples.

Definition of singly linked list

Singly linked list is a linear list data structure in which each element (node) contains two parts: the data field and the pointer field. The data field is used to store the value of the element, and the pointer field points to the next node. The pointer field of the last node is usually empty, indicating the end of the linked list.

Node definition of a singly linked list

First, we define a node type of a singly linked list:

type Node struct {
    data int
    next *Node
}
Copy after login

Among them, the data field stores the value of the node, nextThe field stores the pointer to the next node.

Initialization of singly linked list

Next, we define the initialization function of singly linked list:

type LinkedList struct {
    head *Node
}

func NewLinkedList() *LinkedList {
    return &LinkedList{}
}
Copy after login

In the initialization function, we create an empty linked list and set the head node The pointer is initialized to null.

Insertion operation of singly linked list

The insertion operation of singly linked list can be divided into two situations: inserting a node at the head of the linked list and inserting a node at the end of the linked list.

The first is the function to insert a node at the head of the linked list:

func (list *LinkedList) InsertAtBeginning(value int) {
    newNode := &Node{data: value}
    newNode.next = list.head
    list.head = newNode
}
Copy after login

In this function, we first create a new node and initialize its value to the passed in value. Then point the pointer of the new node to the head of the linked list, and finally update the head node of the linked list to the new node.

Next is the function to insert a node at the end of the linked list:

func (list *LinkedList) InsertAtEnd(value int) {
    newNode := &Node{data: value}
    if list.head == nil {
        list.head = newNode
        return
    }

    current := list.head
    for current.next != nil {
        current = current.next
    }
    current.next = newNode
}
Copy after login

This function first creates a new node and determines whether the linked list is empty. If it is empty, the new node is directly set as the head node; otherwise, the linked list is traversed until the last node is found, and then the new node is inserted after the last node.

Singly linked list deletion operation

Deletion operation is divided into two situations: deleting the head node and deleting the node with the specified value.

The first is the function to delete the head node:

func (list *LinkedList) DeleteAtBeginning() {
    if list.head == nil {
        return
    }
    list.head = list.head.next
}
Copy after login

This function directly points the head node pointer to the next node, thereby deleting the head node.

Next is the function to delete the node with the specified value:

func (list *LinkedList) DeleteByValue(value int) {
    if list.head == nil {
        return
    }
    if list.head.data == value {
        list.head = list.head.next
        return
    }

    prev := list.head
    current := list.head.next
    for current != nil {
        if current.data == value {
            prev.next = current.next
            return
        }
        prev = current
        current = current.next
    }
}
Copy after login

In this function, we need to first determine whether the linked list is empty. Then traverse the linked list starting from the head node, find the node where the target value is located and delete it.

Singly linked list traversal operation

The last is the singly linked list traversal operation:

func (list *LinkedList) Print() {
    current := list.head
    for current != nil {
        fmt.Print(current.data, " ")
        current = current.next
    }
    fmt.Println()
}
Copy after login

This function prints the value of the node one by one starting from the head node until the end of the linked list.

Sample code

The following is a complete sample code that demonstrates how to use a singly linked list:

package main

import "fmt"

type Node struct {
    data int
    next *Node
}

type LinkedList struct {
    head *Node
}

func NewLinkedList() *LinkedList {
    return &LinkedList{}
}

func (list *LinkedList) InsertAtBeginning(value int) {
    newNode := &Node{data: value}
    newNode.next = list.head
    list.head = newNode
}

func (list *LinkedList) InsertAtEnd(value int) {
    newNode := &Node{data: value}
    if list.head == nil {
        list.head = newNode
        return
    }

    current := list.head
    for current.next != nil {
        current = current.next
    }
    current.next = newNode
}

func (list *LinkedList) DeleteAtBeginning() {
    if list.head == nil {
        return
    }
    list.head = list.head.next
}

func (list *LinkedList) DeleteByValue(value int) {
    if list.head == nil {
        return
    }
    if list.head.data == value {
        list.head = list.head.next
        return
    }

    prev := list.head
    current := list.head.next
    for current != nil {
        if current.data == value {
            prev.next = current.next
            return
        }
        prev = current
        current = current.next
    }
}

func (list *LinkedList) Print() {
    current := list.head
    for current != nil {
        fmt.Print(current.data, " ")
        current = current.next
    }
    fmt.Println()
}

func main() {
    list := NewLinkedList()

    list.InsertAtEnd(1)
    list.InsertAtEnd(2)
    list.InsertAtEnd(3)
    list.Print()

    list.DeleteByValue(2)
    list.Print()

    list.DeleteAtBeginning()
    list.Print()
}
Copy after login

The above is a detailed guide to using the Go language to implement a singly linked list. I hope that through the introduction and sample code of this article, readers can have a deeper understanding of the principles and implementation of singly linked lists.

The above is the detailed content of Go Language Programming Guide: Detailed Explanation of Single Linked List Implementation. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1664
14
PHP Tutorial
1266
29
C# Tutorial
1239
24
How to solve the user_id type conversion problem when using Redis Stream to implement message queues in Go language? How to solve the user_id type conversion problem when using Redis Stream to implement message queues in Go language? Apr 02, 2025 pm 04:54 PM

The problem of using RedisStream to implement message queues in Go language is using Go language and Redis...

What should I do if the custom structure labels in GoLand are not displayed? What should I do if the custom structure labels in GoLand are not displayed? Apr 02, 2025 pm 05:09 PM

What should I do if the custom structure labels in GoLand are not displayed? When using GoLand for Go language development, many developers will encounter custom structure tags...

What is the problem with Queue thread in Go's crawler Colly? What is the problem with Queue thread in Go's crawler Colly? Apr 02, 2025 pm 02:09 PM

Queue threading problem in Go crawler Colly explores the problem of using the Colly crawler library in Go language, developers often encounter problems with threads and request queues. �...

In Go, why does printing strings with Println and string() functions have different effects? In Go, why does printing strings with Println and string() functions have different effects? Apr 02, 2025 pm 02:03 PM

The difference between string printing in Go language: The difference in the effect of using Println and string() functions is in Go...

What libraries are used for floating point number operations in Go? What libraries are used for floating point number operations in Go? Apr 02, 2025 pm 02:06 PM

The library used for floating-point number operation in Go language introduces how to ensure the accuracy is...

What is the difference between `var` and `type` keyword definition structure in Go language? What is the difference between `var` and `type` keyword definition structure in Go language? Apr 02, 2025 pm 12:57 PM

Two ways to define structures in Go language: the difference between var and type keywords. When defining structures, Go language often sees two different ways of writing: First...

Which libraries in Go are developed by large companies or provided by well-known open source projects? Which libraries in Go are developed by large companies or provided by well-known open source projects? Apr 02, 2025 pm 04:12 PM

Which libraries in Go are developed by large companies or well-known open source projects? When programming in Go, developers often encounter some common needs, ...

When using sql.Open, why does not report an error when DSN passes empty? When using sql.Open, why does not report an error when DSN passes empty? Apr 02, 2025 pm 12:54 PM

When using sql.Open, why doesn’t the DSN report an error? In Go language, sql.Open...

See all articles