Go语言数据结构之单链表的实例详解

Go语言数据结构之单链表的实例详解

简介

单链表是一个常见的数据结构,它由一系列节点组成,每个节点包含一个值和指向下一个节点的引用。单链表的插入和删除操作比较容易,但是访问操作的效率相对较低。

在Go语言中,可以使用结构体配合指针来实现单链表。

实现思路

为了实现单链表,需要先定义一个节点结构体Node,包含一个value值和一个next指针。通过next指针将所有节点串联起来,实现链表的功能。

type Node struct {
    value interface{} // 节点的值
    next  *Node        // 指向下一个节点的指针
}

func NewNode(v interface{}) *Node {
    return &Node{v, nil}
}

type LinkedList struct {
    head *Node // 单链表头节点
    tail *Node // 单链表尾节点
    size int   // 单链表大小
}

添加节点

向单链表添加节点的方法分两种情况,一种是头插法,另一种是尾插法。其中头插法的时间复杂度为O(1),尾插法的时间复杂度为O(n),因为需要遍历整个链表。

头插法

实现头插法可以将新节点插入链表头部。

func (list *LinkedList) AddHead(v interface{}) {
    newNode := NewNode(v)
    if list.head == nil {
        list.head = newNode
        list.tail = newNode
    } else {
        newNode.next = list.head
        list.head = newNode
    }
    list.size++
}

尾插法

实现尾插法可以将新节点插入链表尾部。

func (list *LinkedList) AddTail(v interface{}) {
    newNode := NewNode(v)
    if list.head == nil {
        list.head = newNode
        list.tail = newNode
    } else {
        list.tail.next = newNode
        list.tail = newNode
    }
    list.size++
}

删除节点

删除节点的方法也分两种情况,一种是根据值来删除节点,另一种是根据位置来删除节点。

根据值来删除节点

根据值来删除节点需要在链表中查找该值所对应的节点,并删除它。

func (list *LinkedList) Remove(v interface{}) {
    if list.head == nil {
        return
    }
    if list.head.value == v {
        list.head = list.head.next
        list.size--
        return
    }
    node := list.head
    for node.next != nil {
        if node.next.value == v {
            node.next = node.next.next
            list.size--
            return
        }
        node = node.next
    }
}

根据位置来删除节点

根据位置来删除节点需要遍历链表,找到指定位置的节点。

func (list *LinkedList) RemoveAtIndex(index int) {
    if index < 0 || index >= list.size || list.head == nil {
        return
    }
    if index == 0 {
        list.head = list.head.next
        list.size--
        return
    }
    node := list.head
    for i := 0; i < index-1; i++ {
        node = node.next
    }
    node.next = node.next.next
    if index == list.size-1 {
        list.tail = node
    }
    list.size--
}

示例说明

示例1

list := LinkedList{}
list.AddTail(1)
list.AddTail(2)
list.AddTail(3)
list.AddTail(4)
list.AddTail(5)
list.Remove(3)
fmt.Println(list) // {1 2 4 5}

在这个示例中,我们创建了一个单链表,然后向其中添加5个节点,最后删除了一个值为3的节点,输出链表的内容为{1 2 4 5}。

示例2

list := LinkedList{}
list.AddHead(1)
list.AddHead(2)
list.AddHead(3)
list.AddHead(4)
list.AddHead(5)
list.RemoveAtIndex(2)
fmt.Println(list) // {5 4 2 1}

在这个示例中,我们创建了一个单链表,然后向其中添加5个节点,最后删除了第3个节点,输出链表的内容为{5 4 2 1}。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Go语言数据结构之单链表的实例详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • qqwry.dat的数据结构图文解释第2/2页

    首先,对于“qqwry.dat的数据结构图文解释第2/2页”这个主题,我们需要先对其进行一些介绍。 qqwry.dat是一种IP地址转换工具,它可以将一个给定的IP地址转换成一个物理地址。它的数据结构是一种二叉查找树,在此二叉查找树中每个节点保存了一个IP地址段和该段IP地址所对应的物理地址的信息。这个数据结构的结构图可以在“qqwry.dat的数据结构图文…

    数据结构 2023年5月17日
    00
  • R语言数据结构之矩阵、数组与数据框详解

    R语言数据结构之矩阵、数组与数据框详解 在R语言中,矩阵、数组和数据框是常见的数据结构。本文将从定义、创建、访问和操作等方面详细讲解这些数据结构。 矩阵(matrix) 定义 矩阵是R语言中的一种二维数据结构,所有的元素都必须是同一类型的,并且矩阵中的行列数必须相同。矩阵可以使用matrix函数创建。 创建 # 创建一个3行4列的矩阵,所有元素都为0 mat…

    数据结构 2023年5月17日
    00
  • C语言数据结构之复杂链表的拷贝

    C语言数据结构之复杂链表的拷贝 什么是复杂链表 在了解如何拷贝复杂链表之前,首先需要知道什么是复杂链表。复杂链表是由多个节点组成的链表,每个节点除了包含普通链表节点的值和指向下一个节点的指针外,还包含一个指向链表中的任意一个节点的指针。因此,每个节点有两个指针:一个指向下一个节点,一个指向任意一个节点。 复杂链表示意图如下: +—+ +—+ +—…

    数据结构 2023年5月17日
    00
  • Lua学习笔记之数据结构

    下面开始对”Lua学习笔记之数据结构”的完整攻略进行详细说明。 一、前言 在学习Lua时,数据结构是非常重要的一个方面,掌握了数据结构,就可以更好地编写Lua程序,提高程序的性能和可读性。本篇攻略主要介绍四种Lua数据结构:数组、表、字符串和函数,分别介绍其含义、特点、创建方法以及基本操作。 二、数组 2.1 数组的定义和创建 Lua中的数组是一种类似于C语…

    数据结构 2023年5月17日
    00
  • Mysql 数据库结构及索引类型

    好的。首先,我们需要了解 Mysql 数据库的基本结构和索引类型。 Mysql 数据库结构 Mysql 数据库包含多个数据库,每个数据库包含多个数据表,每个数据表包含多个数据记录(或者叫行)。关键的概念包括数据库、数据表、数据记录以及 Mysql 列类型等。 数据库 Mysql 数据库是一个命名的容器,用于存储和管理相关数据表。可以使用以下 SQL 代码来创…

    数据结构 2023年5月17日
    00
  • Redis数据结构之链表与字典的使用

    Redis是一个开源、基于内存的数据结构存储系统。Redis支持多种数据类型,包括字符串、整数、浮点数、列表、哈希表、集合、有序集合等。本文将详细介绍Redis数据结构之链表与字典的使用。 链表 链表是Redis中常用的数据结构之一,主要用于存储有序的元素列表。链表中的每个元素都包含了一个指向前驱元素和后继元素的指针,这种结构可以方便地实现链表的插入、删除和…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十九天–数据库(4)

    本篇攻略是针对Java数据库相关面试题的,为了方便浏览,我将其分为以下几个部分: 1. 数据库连接池 在Java开发中,我们使用JDBC连接数据库进行数据操作时,为了提高数据库访问性能,通常会使用数据库连接池技术。常见的数据库连接池有:C3P0、Druid、HikariCP等。 C3P0 C3P0是一个开源的数据库连接池,可以设置最大连接数、最小连接数、最大…

    数据结构 2023年5月17日
    00
  • Java数据结构之常见排序算法(上)

    Java数据结构之常见排序算法(上) 本篇文章将介绍常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。这些排序算法既是学习算法和数据结构的入门知识,也是在实际工作中常用的基础算法。 冒泡排序 冒泡排序是一种简单的排序算法,它的基本思想是从前往后依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换它们的位置,重复这个过程,每一轮比较…

    数据结构 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部