go实现反转链表

Go实现反转链表

简介

在 Go 中实现反转链表需要了解链表的基本概念和 Go 函数的用法。

链表由节点组成,每个节点包含一个数据域和一个指针域,指向下一个节点。而反转链表就是将所有节点的指针指向倒转。实现反转链表的过程,可以使用三个指针。

代码实现

下面是一个基于 Go 语言实现反转链表的示例代码。

type ListNode struct {
    Val int
    Next *ListNode
}

func reverseList(head *ListNode) *ListNode {
    var prev *ListNode
    curr := head

    for curr != nil {
        next := curr.Next
        curr.Next = prev
        prev = curr
        curr = next
    }

    return prev
}

代码解释

首先我们声明了一个链表结构体,它包含了一个数据域 Val 和一个指向下一个节点的指针域 Next。

type ListNode struct {
    Val int
    Next *ListNode
}

接着,我们定义了一个名为 reverseList 的函数,它接收一个指向链表开头的指针 head,返回一个指向链表结尾的指针。

func reverseList(head *ListNode) *ListNode {}

我们使用三个指针变量来完成链表的反转。指针 prev 用来保存已反转部分的链表,指针 curr 则用来遍历原链表,而指针 next 则用来保存 curr 的 next 指针。

var prev *ListNode
curr := head

接下来,我们对链表进行遍历。当当前节点 curr 不为 nil 时,取出 curr 的下一个节点 next,将 curr 的 next 指针指向 prev,然后将 prev 指向当前 curr 节点。最后,将 curr 重新赋值为 next,继续遍历下一个节点。

for curr != nil {
    next := curr.Next
    curr.Next = prev
    prev = curr
    curr = next
}

遍历结束后,链表反转完成。最后,我们返回 prev 指向反转后的链表结尾。

return prev

示例说明

下面我们使用以下两个示例测试我们的反转链表代码。

示例1:

输入: 1->2->3->4->5->NULL

输出: 5->4->3->2->1->NULL

func main() {
    // 创建测试链表
    l1 := &ListNode{Val: 1}
    l2 := &ListNode{Val: 2}
    l3 := &ListNode{Val: 3}
    l4 := &ListNode{Val: 4}
    l5 := &ListNode{Val: 5}
    l1.Next = l2
    l2.Next = l3
    l3.Next = l4
    l4.Next = l5

    // 反转链表
    result := reverseList(l1)

    // 输出反转后的链表
    for result != nil {
        fmt.Printf("%d -> ", result.Val)
        result = result.Next
    }
    fmt.Println("NULL")
}

我们创建了一个包含 5 个节点的链表,然后将它传入函数 reverseList 中进行反转,最终输出了反转后的链表。

示例2:

输入: NULL

输出: NULL

func main() {
    // 创建空链表
    var l1 *ListNode

    // 反转链表
    result := reverseList(l1)

    // 输出反转后的链表
    if result != nil {
        fmt.Printf("%d -> ", result.Val)
        result = result.Next
    }
    fmt.Println("NULL")
}

我们创建了一个空链表,然后将它传入函数 reverseList 中进行反转,最终输出了 NULL。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:go实现反转链表 - Python技术站

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

相关文章

  • C语言编程深入理解取整取余取模问题示例分析

    C语言编程深入理解取整取余取模问题示例分析 什么是取整、取余、取模? 在C语言中,/ 可以用来进行整除(取整)操作,% 可以用来进行取余或取模操作。 当两个整数相除时,如果能够整除,则结果即为商;否则,结果则包括商和余数,其中商为取整结果,而余数则为取余或取模的结果。 取整:将一个浮点数四舍五入或向下取整成整数,例如: int a = 5.6 / 2; //…

    other 2023年6月26日
    00
  • Spring中bean的生命周期之getSingleton方法

    让我们来详细讲解一下“Spring中bean的生命周期之getSingleton方法”这个问题。 什么是Bean的生命周期 在Spring中,Bean的生命周期分为以下阶段: 实例化:Spring容器创建一个Bean的实例 属性注入:Spring容器将配置文件或注解中的属性注入到Bean中 初始化:Spring容器初始化Bean 使用:Bean在容器中被使用…

    other 2023年6月27日
    00
  • 教你如何通过PL/SQL创建序列和触发器实现表自增字段

    下面我详细讲解一下“教你如何通过PL/SQL创建序列和触发器实现表自增字段”的完整攻略。 创建序列 序列是在 Oracle 数据库中生成一系列唯一标识号的一种方法。它通常用于创建自增字段。在 PL/SQL 中,可以通过以下语句创建一个序列: CREATE SEQUENCE sequence_name START WITH 1 INCREMENT BY 1 M…

    other 2023年6月25日
    00
  • 无人深空分辨率低怎么办 游戏分辨率低机掉纹理解决方法

    针对“无人深空分辨率低怎么办,游戏分辨率低机掉纹理解决方法”这一问题,我来给出一个完整的攻略: 1. 解决无人深空分辨率低的问题 在游戏设置中将分辨率调整为更高的数值可以提升游戏画面的清晰度和细节。 另外,若电脑硬件足够强劲,可以尝试使用超采样(supersampling)技术,即在当前分辨率的基础上,提高内部渲染分辨率,再经过缩放输出到显示器上。 以下是超…

    other 2023年6月27日
    00
  • 电脑内存多大才够用?教你合理使用虚拟内存

    电脑内存多大才够用?教你合理使用虚拟内存攻略 1. 了解电脑内存和虚拟内存的概念 电脑内存(RAM)是计算机用于存储正在运行的程序和数据的地方。虚拟内存是一种扩展内存的技术,它使用硬盘空间来模拟额外的内存。当内存不足时,操作系统会将一部分数据从内存转移到硬盘上的虚拟内存中。 2. 确定合适的内存容量 要确定电脑内存多大才够用,需要考虑以下几个因素: 操作系统…

    other 2023年7月31日
    00
  • notepad++:正则表达式系统教程

    notepad++:正则表达式系统教程 什么是正则表达式? 正则表达式是一种强大的字符串匹配工具,它用一种描述性的语言来定义一些字符串的搜索模式,常用于文本搜索、替换、处理等操作。常见的正则表达式引擎有 Perl、Java、.NET 等,而 Notepad++ 中采用的正则表达式引擎是 PCRE(Perl Compatible Regular Express…

    其他 2023年3月29日
    00
  • 用指定用户名访问共享文件

    访问Windows共享文件时,可以指定用户名和密码进行认证。以下是一些步骤和示例来演示如何使用指定用户名访问Windows共享文件。 步骤 打开资源管理器,输入 \\[IP地址或主机名],可以看到共享文件夹。 右键点击文件夹,选择“映射网络驱动器”,勾选“连接时使用其他凭据”。 输入用户名和密码,点击“完成”。 根据需要调整权限和映射的驱动器盘符,点击“完成…

    other 2023年6月27日
    00
  • 全废话SQL Server统计信息(1)——统计信息简介

    全废话SQL Server统计信息(1)——统计信息简介的完整攻略 在SQL Server中,统计信息是用于优化查询性能的重要组成部分。本文将为您提供一份详细的全废话SQL Server统计信息(1)——统计信息简介的完整攻略,包括统计信息的基本概念、统计信息的作用、统计信息的类型和两个示例说明。 统计信息的基本概念 统计信息是SQL Server中的一种元…

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