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日

相关文章

  • zabbix监控windows部署安装

    以下是“zabbix监控windows部署安装”的完整攻略: zabbix监控windows部署安装 Zabbix是一款开源的网络监控软件,控各种网络设备、服务器和应用程序。在本攻略中,我们将介绍如何在Windows上部署Zabbix监控,并监控服务器。 步骤1:安装Zabbix Server 在开始部署Zabbix监控之前,您需要在Windows服务器上安…

    other 2023年5月7日
    00
  • php 静态属性和静态方法区别详解

    PHP 静态属性和静态方法区别详解 1. 静态属性 静态属性是属于类的属性,不属于类的实例对象。它可以在类内部定义,并且通过self::或类名::的方式访问,而不需要实例化类。 静态属性的主要特点包括:- 所有实例对象共享同一个静态属性的值。- 静态属性可以在类内外使用,且所有实例对象和类都可以访问。- 静态属性可以在类外直接使用,通过类名::$静态属性名的…

    other 2023年6月28日
    00
  • python3中类的继承以及self和super的区别详解

    下面是 “Python3中类的继承以及self和super的区别详解” 的完整攻略。 类的继承 在Python3中,类的继承是通过在类定义时指定父类实现的,例如: class Animal: def __init__(self, name): self.name = name class Dog(Animal): def __init__(self, nam…

    other 2023年6月26日
    00
  • python 自定义装饰器实例详解

    Python自定义装饰器实例详解 什么是装饰器 装饰器是Python语法中的一种高级函数,它可以让已有函数或类的属性发生改变,而不修改原本函数或类的定义。 装饰器的语法 def decorator(func): # 在这里对被装饰函数进行处理,或者添加新的功能 return func 使用装饰器的场景 装饰器主要用于在不修改原有代码的情况下,给函数附加额外的…

    other 2023年6月25日
    00
  • miui6官网提供下载地址

    MIUI 6官网提供下载地址攻略 MIUI 6是小米公司推出的一款基于Android系统的操作界面。如果你想下载MIUI 6,可以通过官方网站获取下载地址。下面是详细的攻略过程: 步骤一:打开MIUI 6官网 首先,打开你的浏览器,输入MIUI 6的官方网址:https://www.miui.com/。 步骤二:进入下载页面 在官网首页,你可以找到一个名为“…

    other 2023年8月4日
    00
  • Go单元测试工具gomonkey的使用

    Go单元测试工具gomonkey的使用攻略 简介 gomonkey是一个用于Go语言的单元测试工具,它可以帮助开发者在测试过程中模拟和修改函数的行为,以便更好地进行单元测试。本攻略将详细介绍gomonkey的使用方法,并提供两个示例说明。 安装 首先,你需要使用go get命令安装gomonkey包: go get github.com/agiledrago…

    other 2023年7月29日
    00
  • Java类继承关系中的初始化顺序实例详解

    Java类继承关系中的初始化顺序实例详解 一、前言 在Java类继承关系的实例化过程中,子类的初始化会涉及到父类的初始化,这个过程的顺序往往会影响程序的执行结果。本文将详细讲解Java类继承关系中的初始化顺序。 二、初始化顺序 在Java中,类和对象的初始化有以下几种情况: 静态代码块(只在类加载时执行一次) 非静态代码块(每次创建对象时都会执行) 构造方法…

    other 2023年6月20日
    00
  • C语言中数组的使用详解

    C语言中数组的使用详解 什么是数组 数组(Array)是一种线性数据结构,它由一组相同类型的数据元素组成。C语言中的数组是一段固定长度、相同数据类型的连续内存空间。 定义数组 C语言中,声明数组需要指定其元素类型和元素个数。以下是两种典型的数组声明方式。 一维数组: int arr[10]; // 声明一个长度为10的整型数组 二维数组: int arr[3…

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