详解Go语言中单链表的使用

详解Go语言中单链表的使用

什么是单链表

单链表(Singly Linked List)是一种常见的数据结构之一,它由一串节点组成,每个节点包含两个部分:数据部分和指向下一个节点的指针部分。

单链表的头部节点称为头节点,尾部节点称为尾节点。尾节点的指针部分指向NULL。

Go语言中单链表的实现

在Go语言中实现单链表,我们可以定义一个结构体表示链表节点,代码如下:

type ListNode struct {
    Val  int         // 数据部分
    Next *ListNode   // 指向下一个节点的指针部分
}

我们可以定义单链表的头节点,然后使用头节点来对链表进行操作(添加、删除、查找等)。

type LinkedList struct {
    Head *ListNode   // 头节点
}

Go语言单链表常见操作

初始化一个单链表

我们可以定义一个构造函数进行初始化:

func NewLinkedList() *LinkedList {
    return &LinkedList{
        Head: &ListNode{Val: 0, Next: nil},
    }
}

在链表的末尾添加一个节点

我们可以先找到链表的尾部节点,然后在尾部节点的后面添加一个新的节点。代码如下:

func (list *LinkedList) AddAtTail(val int) {
    newNode := &ListNode{
        Val:  val,
        Next: nil,
    }
    // 找到尾部节点
    tail := list.Head
    for tail.Next != nil {
        tail = tail.Next
    }
    tail.Next = newNode
}

在链表的头部添加一个节点

我们可以先创建一个新的节点,然后将新节点的指针部分指向头节点的下一个节点,最后将头节点的指针部分指向新节点。代码如下:

func (list *LinkedList) AddAtHead(val int) {
    newNode := &ListNode{
        Val:  val,
        Next: nil,
    }
    newNode.Next = list.Head.Next
    list.Head.Next = newNode
}

在链表的第index个位置插入一个节点

我们可以先找到要插入节点的位置,然后创建新的节点,将新节点的指针部分指向原来位置上的节点,最后将前一个节点的指针部分指向新节点。代码如下:

func (list *LinkedList) AddAtIndex(index int, val int) {
    newNode := &ListNode{
        Val:  val,
        Next: nil,
    }
    // 找到要插入的位置
    prev := list.Head
    for i := 0; i < index && prev != nil; i++ {
        prev = prev.Next
    }
    if prev == nil {
        return
    }
    // 将新节点插入到链表中
    newNode.Next = prev.Next
    prev.Next = newNode
}

在链表中删除一个节点

我们可以先找到要删除节点的前一个节点,然后将其指针部分指向被删除节点的下一个节点。代码如下:

func (list *LinkedList) DeleteAtIndex(index int) {
    // 找到要删除的节点的前一个节点
    prev := list.Head
    for i := 0; i < index && prev != nil; i++ {
        prev = prev.Next
    }
    if prev == nil || prev.Next == nil {
        return
    }
    // 将前一个节点的指针部分指向下一个节点
    prev.Next = prev.Next.Next
}

示例说明

示例一

我们可以按照以下步骤在Go语言中使用单链表:

  1. 创建一个新的单链表

go
list := NewLinkedList()

  1. 在单链表中添加节点

go
list.AddAtTail(1)
list.AddAtTail(2)
list.AddAtTail(3)
list.AddAtIndex(1, 4)
list.AddAtHead(5)

  1. 删除一个节点

go
list.DeleteAtIndex(3)

最终单链表的结果为:5, 1, 4, 2

示例二

我们还可以使用单链表来实现LRU缓存淘汰算法,以下是实现代码:

type LRUCache struct {
    capacity    int
    linkedList  *LinkedList
    hashMap     map[int]*ListNode
}

func Constructor(capacity int) LRUCache {
    return LRUCache{
        capacity:   capacity,
        linkedList: NewLinkedList(),
        hashMap:    make(map[int]*ListNode),
    }
}

func (this *LRUCache) Get(key int) int {
    if _, ok := this.hashMap[key]; !ok {
        return -1
    }
    node := this.hashMap[key]
    this.linkedList.DeleteNode(node)
    this.linkedList.AddAtHead(node.Val)
    return node.Val
}

func (this *LRUCache) Put(key int, value int) {
    if _, ok := this.hashMap[key]; ok {
        node := this.hashMap[key]
        node.Val = value
        this.linkedList.DeleteNode(node)
        this.linkedList.AddAtHead(node.Val)
        return
    }
    if this.linkedList.Length() >= this.capacity {
        tail := this.linkedList.RemoveTail()
        delete(this.hashMap, tail.Val)
    }
    newNode := &ListNode{
        Val:  value,
        Next: nil,
    }
    this.linkedList.AddAtHead(value)
    this.hashMap[key] = this.linkedList.Head.Next
}

以上是Go语言中单链表的使用攻略,希望对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Go语言中单链表的使用 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • springboot+mybatis配置clickhouse实现插入查询功能

    以下是关于Spring Boot + MyBatis配置ClickHouse实现插入查询功能的完整攻略,包含两个示例说明: 1. 添加ClickHouse依赖 在项目的pom.xml文件中添加ClickHouse的依赖: <dependency> <groupId>ru.yandex.clickhouse</groupId&gt…

    other 2023年10月19日
    00
  • python基础教程之五种数据类型详解

    Python基础教程之五种数据类型详解 作为一门脚本语言,Python支持的数据类型非常丰富,常用的数据类型有五种:数字、字符串、列表、元组和字典。在本篇文章中,我们将详细讲解这五种数据类型的定义、特点、操作以及常见的应用场景。 1. 数字 数字是Python中最基本的数据类型,它包括整数(int)、浮点数(float)和复数(complex)三种类型。 1…

    other 2023年6月27日
    00
  • 你该知道的Gradle配置知识总结

    你该知道的Gradle配置知识总结 Gradle是一种强大的构建工具,用于构建和管理项目。在本攻略中,我们将详细讲解一些你应该知道的Gradle配置知识,并提供两个示例说明。 1. Gradle配置文件 Gradle使用Groovy或Kotlin编写的配置文件来定义项目的构建逻辑。常见的配置文件包括: settings.gradle:用于配置项目的设置和包含…

    other 2023年10月13日
    00
  • JAVA基本类型包装类 BigDecimal BigInteger 的使用

    JAVA基本类型包装类 BigDecimal BigInteger 的使用 1. BigDecimal的使用 创建BigDecimal对象 可以使用以下方法创建BigDecimal对象: BigDecimal number = new BigDecimal(\"10.5\"); 进行数值计算 BigDecimal类提供了丰富的数值计算方法…

    other 2023年10月15日
    00
  • Dreamweaver CS3网页制作中的CSS布局规则

    Dreamweaver CS3网页制作中的CSS布局规则攻略 1. CSS布局规则简介 在Dreamweaver CS3中,CSS布局规则用于控制网页元素的位置和样式。通过使用CSS布局规则,您可以创建具有各种布局风格的网页。 2. CSS布局规则的基本语法 CSS布局规则由选择器和声明块组成。选择器用于选择要应用布局规则的HTML元素,声明块包含一系列属性…

    other 2023年9月5日
    00
  • windows下mongodb集群搭建

    在Windows下搭建MongoDB集群需要进行以下步骤: 下载MongoDB安装包并安装 配置MongoDB的配置文件 启动MongoDB节点 初始化MongoDB集群 添加MongoDB节点 验证MongoDB集群是否正常工作 下面将详细介绍每个步骤,并提供两个示例说明。 1. 下载MongoDB安装包并安装 首先需要从MongoDB官网下载Window…

    other 2023年5月5日
    00
  • Python中super函数用法实例分析

    我来为您讲解“Python中super函数用法实例分析”的完整攻略。 什么是super函数? 在Python中,super是一个用于调用父类方法的函数。它可以用于单继承和多继承情况下。super的基本语法为: super([type[, object-or-type]]) 其中type为类名,object-or-type是要调用其父类方法的对象或类。注意,o…

    other 2023年6月27日
    00
  • Android百度地图应用之创建显示地图

    下面是详细讲解”Android百度地图应用之创建显示地图”的完整攻略。 准备工作 在进行百度地图的开发之前,我们需要先进行以下的准备工作: 注册百度开发者账号,进入百度开发者平台进行注册; 创建应用并获取AK,进入控制台,创建应用并获取AK; 下载Android SDK,并进行安装。 创建项目 打开Android Studio,创建一个新项目; 在”Proj…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部