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日

相关文章

  • 在matlab中创建类似字典的数据结构方式

    当需要使用类似字典的数据结构时,Matlab中可以使用结构体来实现。结构体是一种有序的数据集合,每个元素都可以包含不同类型的数据(如字符串、数值等),并通过指定一个名称来唯一地标识该元素。 创建一个空结构体 使用struct函数可以创建一个空的结构体,可以使用下面的代码: st = struct; 添加键值对 可以将键值对添加到结构体中,可以使用下面的代码向…

    数据结构 2023年5月17日
    00
  • Java数据结构之对象的比较

    Java数据结构之对象的比较 在Java中,对象的比较是非常重要的操作。我们常常需要对不同的对象进行比较,以便对它们进行排序、按照某个条件过滤等操作。本文将详细讲解Java中对象的比较,并给出一些示例来说明。 对象的比较方法 Java中有两种对象比较方法:值比较和引用比较。值比较就是比较两个对象的值是否相等,而引用比较是比较两个对象是否是同一个对象。 值比较…

    数据结构 2023年5月17日
    00
  • C语言实题讲解快速掌握单链表上

    C语言实题讲解快速掌握单链表 什么是单链表? 单链表是一种链式存储的线性数据结构,它由一系列称为节点的组成。每个节点都包括两个部分:数据域和指针域。指针域指示了下一个节点的地址,因此,我们可以通过遍历链表的方式访问所有节点。 单链表的操作 创建一个单链表 我们可以通过以下步骤来创建一个单链表:1. 定义单链表的节点结构体,包括数据域和指针域。2. 定义一个指…

    数据结构 2023年5月17日
    00
  • mosn基于延迟负载均衡算法 — 走得更快,期待走得更稳

    前言 这篇文章主要是介绍mosn在v1.5.0中新引入的基于延迟的负载均衡算法。 对分布式系统中延迟出现的原因进行剖析 介绍mosn都通过哪些方法来降低延迟 构建来与生产环境性能分布相近的测试用例来对算法进行验证 地址:https://github.com/mosn/mosn/pull/2253 在开始聊基于延迟的负载均衡算法之前,先介绍下什么是负载均衡——…

    算法与数据结构 2023年5月8日
    00
  • C语言数据结构实例讲解单链表的实现

    C语言数据结构实例讲解单链表的实现 单链表是一种线性的数据结构,它由一系列节点组成,每个节点都包含一个数据域和一个指向下一个节点的指针域。单链表常用于需要频繁插入删除元素的场景中。 单链表的数据结构设计 在C语言中,我们可以使用结构体来定义单链表的节点: typedef struct node { int data; // 数据域 struct node* …

    数据结构 2023年5月17日
    00
  • Lua教程(七):数据结构详解

    Lua教程(七):数据结构详解 Lua 中的数据结构广泛应用于各种计算机程序中。本文将详细介绍 Lua 中的数组、列表、栈、队列、集合和字典等数据结构的使用以及相关的函数。 数组 数组是存储在连续内存位置上的相同数据类型的元素集合。Lua 中的数组索引默认从 1 开始。下面是一些常用的 Lua 数组函数: table.concat(arr[, sep[, i…

    数据结构 2023年5月17日
    00
  • Python描述数据结构学习之哈夫曼树篇

    Python描述数据结构学习之哈夫曼树篇攻略 简介 本篇攻略旨在介绍哈夫曼树的概念、构建方法和应用场景,并结合Python代码进行演示。 哈夫曼树概念 哈夫曼树(Huffman Tree)又称最优树,它是一种带权路径长度最短的树。所谓带权路径长度,就是每个节点的权值乘以其到根节点的路径长度(即树的层数)之和。哈夫曼树广泛应用于数据压缩领域。 哈夫曼树构建方法…

    数据结构 2023年5月17日
    00
  • C语言数据结构树的双亲表示法实例详解

    C语言数据结构树的双亲表示法实例详解 什么是双亲表示法 在树上,每个节点都有且仅有一个父节点(根节点除外)。对于一个树结构,我们可以使用许多方法来表示这个树,其中最常见的一种方法是双亲表示法。该表示法使用一个一维数组来存储树的节点,数组的下标即为该节点的编号,数组的值则表示该节点的父节点编号。 当一个节点没有父节点时,该节点即为根节点。 双亲表示法的优缺点 …

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