详解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日

相关文章

  • Ubuntu环境下SSH的安装及使用详解

    Ubuntu环境下SSH的安装及使用详解 什么是SSH SSH,全称为Secure Shell, 是一种加密的网络协议,用于远程连接Linux和Unix操作系统上的计算机。SSH技术能够在用户和远程服务器之间建立安全的、经过身份验证的连接,并且能够在该连接上传输数据,以此保证数据的完整性和机密性。 SSH的安装 为了使用SSH,需要在自己的机器上安装Open…

    other 2023年6月27日
    00
  • WPS学校红头文件标题怎么做?

    要制作WPS学校红头文件标题,需要遵循如下步骤: 步骤一:打开WPS 在电脑桌面或文件夹中双击WPS文字图标,在弹出的主界面中选择“文字”文档。 步骤二:设置红头文件样式 点击文档顶部的“页面布局”标签,展开后选择“页眉页脚”选项,在弹出的下拉菜单中点击“添加页眉”,选择“空白”的页眉样式。 步骤三:设置标题样式 在页眉中输入文档标题,选中标题并点击鼠标右键…

    other 2023年6月26日
    00
  • React组件重构之嵌套+继承及高阶组件详解

    React组件重构之嵌套+继承及高阶组件详解 在React开发中,组件的重构是一种常见的优化方式,可以提高代码的可读性和可维护性。本攻略将详细讲解React组件重构中的嵌套、继承以及高阶组件的使用方法。 嵌套组件 嵌套组件是指将一个组件作为另一个组件的子组件,通过这种方式可以将复杂的UI拆分成多个独立的小组件,提高代码的可复用性和可测试性。 示例1:嵌套组件…

    other 2023年7月27日
    00
  • thymeleaf实现th:each双重多重嵌套功能

    Thymeleaf实现th:each双重多重嵌套功能攻略 Thymeleaf是一种用于在Web应用程序中创建动态内容的模板引擎。它提供了强大的功能,包括th:each指令,可以用于在模板中进行循环迭代。本攻略将详细介绍如何使用Thymeleaf的th:each指令实现双重多重嵌套功能。 1. 基本语法 在Thymeleaf中,th:each指令用于迭代集合或…

    other 2023年7月28日
    00
  • 只需2步 win10自定义文件夹或文件位置

    请看下面的攻略。 一、打开资源管理器选项 首先,你需要打开文件资源管理器。 在文件资源管理器的顶部菜单栏中,找到“视图”选项并点击它。 在“视图”选项的下拉菜单中,找到“选项”并点击它。 在打开的“文件夹选项”窗口中,选择“查看”选项卡。 在“高级设置”中,找到“统一访问地址栏(U)”选项,勾选它,然后点击“应用”和“确定”按钮。 这时,你就成功打开了资源管…

    other 2023年6月25日
    00
  • Vue封装通用table组件的完整步骤记录

    下面我将详细讲解“Vue封装通用table组件的完整步骤记录”的完整攻略。 步骤一:创建组件 首先,我们需要在Vue项目中创建一个通用的table组件,可用于展示不同类型的数据。创建组件的过程如下: <template> <div class="table"> <table> <thead>…

    other 2023年6月25日
    00
  • python基础之多态

    Python基础之多态 什么是多态 多态是一种对象编程的重要特性,可以让不同类的对象对同一消息作出不同的响应。这些不同的响应都是基于这些对象的类所定义的。 换句话说,多态是指通过相同的接口调用不同的类型对象所产生的不同结果。这就是所谓的“一个接口,多种实现”。 多态的实现方式 在Python中,实现多态有两种方式: 函数重写(方法重定义) 继承和多重继承 以…

    other 2023年6月26日
    00
  • new出来的对象中无法使用@autowired进行对象bean注入问题

    new出来的对象中无法使用@Autowired进行对象bean注入问题的解决攻略 在使用@Autowired注解进行对象bean注入时,Spring框架会自动扫描和管理由Spring容器创建的对象。然而,当我们使用new关键字手动创建对象时,Spring无法感知和管理这些对象,导致无法进行自动注入。 为了解决这个问题,可以采用以下两种方法: 方法一:使用Ap…

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