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语言植物大战数据结构的快速排序可以分为以下步骤: 准备工作 首先需要定义一个关于植物大战中植物的结构体,例如: struct Plant { int hp; int atk; int cost; }; 然后准备一个装载植物信息的数组: struct Plant plants[] = { {75, 36, 100}, {100, 20, 50}, {125,…

    数据结构 2023年5月17日
    00
  • JavaScript数据结构yocto queue队列链表代码分析

    JavaScript数据结构yocto queue队列链表代码分析 什么是队列? 队列(Queue)是一种基础的数据结构,属于线性结构,它的特点是在队列尾插入元素,同时在队列头删除元素,遵循先进先出(FIFO)的原则。队列可以简单的理解为排队,先到达的先被服务,而后到达的则等在队列尾排队等待。队列的应用非常广泛,例如排队系统、消息队列等。 队列的实现方式 队…

    数据结构 2023年5月17日
    00
  • C语言数据结构系列队列篇

    C语言数据结构系列队列篇攻略 简介 队列(Queue)是一种先进先出(First In First Out, FIFO)的线性数据结构,类似于排队买票的过程。本篇攻略将带您从以下三个方面深入浅出地了解C语言数据结构系列队列篇: 队列的特点; 队列的实现; 队列的应用。 队列的特点 队列有两个特殊的端点,队头(front)和队尾(rear)。队头指示队列的头部…

    数据结构 2023年5月17日
    00
  • Java数据结构之单链表详解

    下面是单链表攻略的详细讲解。 什么是单链表? 单链表是一种线性数据结构,它由一系列结点组成,每个结点包含数据域和指针域。数据域用于存储数据,指针域用于指向下一个结点。单链表的优点是插入和删除操作的时间复杂度为O(1),缺点是随机访问的时间复杂度为O(n)。 单链表的基本操作 单链表的基本操作包括插入操作、删除操作、查找操作和遍历操作。下面将分别介绍这些操作。…

    数据结构 2023年5月17日
    00
  • C语言一篇精通链表的各种操作

    C 语言精通链表操作攻略 简介 链表是一种常用的数据结构,它相对于数组等数据结构来说,具有更高的灵活性和增删操作的效率。在 C 语言中,我们可以用指针来实现链表,这也是指针与动态内存分配的重要应用之一。本文将提供在 C 语言中精通链表操作的攻略,包括链表的创建、添加、删除、搜索、遍历等常用操作。 基本结构体定义 链表一般由结构体和指针构成,下面我们定义一个链…

    数据结构 2023年5月17日
    00
  • C语言全面讲解顺序表使用操作

    C语言全面讲解顺序表使用操作 什么是顺序表 顺序表(Sequential List)是一种常见的数据结构,它由一组连续的存储单元组成,并且支持随机访问。通常我们使用数组来实现顺序表。 顺序表的基本操作 初始化 在使用顺序表之前,需要先进行初始化。顺序表的初始化包括两个步骤:指定顺序表的大小,申请内存空间。具体代码如下: #define MAXSIZE 100…

    数据结构 2023年5月17日
    00
  • C语言如何建立链表并实现增删查改详解

    这是一个比较复杂的问题,需要严谨的思考和详细的解释。下面我将按照以下三个部分,分别介绍: 什么是链表,链表的基本结构和实现方法 如何在C语言中建立链表并实现增删查改 两个示例说明 1. 链表的基本结构和实现方法 链表是一种线性数据结构,每个节点包含两个域:一个数据域和一个指针域。数据域存储节点的数据,指针域存储下一个节点的地址。每个节点都可以独立分配空间,所…

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

    C语言实题讲解快速掌握单链表下 简介 单链表是常见的一种数据结构,可以存储任意数量的数据,并且可以高效的进行插入、删除和查找操作。本篇文章将介绍如何使用C语言实现单链表,以及如何应对在实现单链表时所遇到的常见问题。 实现过程 数据结构设计 为了实现单链表,我们需要设计一个数据结构来存储节点信息,一般包含两个成员,一个是数据域,用来存储实际的数据,另一个是指针…

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