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日

相关文章

  • C语言数据结构图的创建与遍历实验示例

    下面是“C语言数据结构图的创建与遍历实验示例”的完整攻略。 1. 创建数据结构图 1.1 创建图对象 首先需要创建一个图对象,可以使用邻接矩阵或邻接表来表示图。使用邻接矩阵表示时,将所有顶点的编号按照一定顺序排列在矩阵的行和列上,使用0或1表示两个顶点之间是否有边。使用邻接表表示时,需要一个array存储所有的顶点,数组中的每个元素包含一个链表,链表中存储与…

    数据结构 2023年5月17日
    00
  • 【华为OD机试 2023】专栏介绍 +华为OD机试介绍+ 真题目录【转载】

    华为题库说明 2022与2023题库的区别 华为OD机试的题库是季度更新的(Q1\Q2\Q3\Q4)。笔者专栏的题库分为2023和2022。 2023的题库是包括2022.11(Q4第四季度)之后以及2023年的题库。 2022的题库是包括2022.11(Q4第四季度)之前题库。 支持的语言 目前大部分题 使用C++ Java JavaScript 以及py…

    算法与数据结构 2023年4月17日
    00
  • Leetcode Practice — 栈和队列

    目录 155. 最小栈 思路解析 20. 有效的括号 思路解析 1047. 删除字符串中的所有相邻重复项 思路解析 1209. 删除字符串中的所有相邻重复项 II 思路解析 删除字符串中出现次数 >= 2 次的相邻字符 剑指 Offer 09. 用两个栈实现队列 239. 滑动窗口最大值 思路解析 155. 最小栈 设计一个支持 push ,pop ,…

    算法与数据结构 2023年4月17日
    00
  • Python数据结构之链表详解

    Python数据结构之链表详解 链表简介 链表是一种数据结构,其每个节点都包含一个指向下一个节点的指针。链表可以用来表示序列,集合或映射等数据结构。在Python中,链表通常由节点和链表类来实现。 单向链表 单向链表是一种链表,每个节点包含指向下一个节点的指针。在Python中,一个节点可以由一个简单的对象表示,而整个链表必须由相互链接的节点组成。 下面是一…

    数据结构 2023年5月17日
    00
  • C++数据结构之双向链表

    C++数据结构之双向链表完整攻略 1. 什么是双向链表 双向链表是一种特殊的链表结构,每个节点拥有两个指针域,分别指向前继和后继节点。 双向链表不需要像单向链表那样从头到尾遍历整个链表,可以通过前后指针直接访问前后节点,提高了查找、删除、插入等操作的效率。 双向链表有一些常用的操作,如插入节点、删除节点、查找节点等。 2. 双向链表的实现 2.1 节点定义 …

    数据结构 2023年5月17日
    00
  • 剑指 Offer 33. 二叉搜索树的后序遍历序列(java解题)

    目录 1. 题目 2. 解题思路 3. 数据类型功能函数总结 4. java代码 5. 踩坑小记 递归调用,显示StackOverflowError 1. 题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树: 5 / \ 2 6 /…

    算法与数据结构 2023年4月23日
    00
  • C语言数据结构之单链表存储详解

    C语言数据结构之单链表存储详解 什么是单链表 链表是一种非顺序存储的数据结构,其每个节点都保存下一个节点的地址。单链表是最简单的链表,每个节点只包含下一个节点的地址。 单链表节点的定义 单链表的节点定义一般包括两个部分:数据域和指针域。数据域存放节点的数据,指针域存放下一个节点的地址。 以下是单链表节点的定义: typedef struct node { i…

    数据结构 2023年5月17日
    00
  • MySQL索引原理详解

    MySQL索引原理详解 MySQL索引是一种数据结构,用于帮助查询语句更快地访问到所需的数据,提高数据库查询效率。本文将详细讲解MySQL索引的原理、类型及如何创建索引。 索引原理 B树 MySQL索引底层数据结构主要采用B树,B树是一种多路平衡查找树。B树的每一个节点可以存储多个键值,每个节点的子节点个数也可以大于2,从而使得查询效率更高。 索引分类 My…

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