文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题

news2024/11/24 12:52:15

七、用go语言,给出一个 O(n)时间的非递归过程,实现对一个含 n个元素的单链表的逆转。要求除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间。

文心一言:

在Go语言中,你可以使用迭代方法来反转一个单链表。这种方法只需要O(1)的额外空间。首先,我们需要定义链表的数据结构:

type ListNode struct {  
    Val  int  
    Next *ListNode  
}

然后,我们可以使用以下代码来反转一个链表:

func reverseList(head *ListNode) *ListNode {  
    var prev *ListNode  
    curr := head  
  
    for curr != nil {  
        nextTemp := curr.Next //保存下一个节点  
        curr.Next = prev      //反转链接  
        prev = curr           //后移  
        curr = nextTemp        //后移  
    }  
  
    return prev  
}

这个函数会迭代链表的每个节点,并改变当前节点的Next指针以指向它的前一个元素。由于我们需要在更改指针之前保存下一个节点,所以我们需要在更改指针之前将当前节点的Next指针保存到临时变量中。

在更改指针后,我们将当前节点和下一个节点向后移动,因此我们可以在O(1)的空间中反转链表。这个函数的时间复杂度是O(n),因为它需要遍历链表的每个节点。

在这里插入图片描述

在这里插入图片描述

讯飞星火:

package main

import "fmt"

type ListNode struct {
    Val  int
    Next *ListNode
}

func reverseList(head *ListNode) *ListNode {
    var prev *ListNode
    current := head
    for current != nil {
        nextTemp := current.Next
        current.Next = prev
        prev = current
        current = nextTemp
    }
    return prev
}

func main() {
    // 创建链表:1 -> 2 -> 3 -> 4 -> 5
    head := &ListNode{Val: 1}
    head.Next = &ListNode{Val: 2}
    head.Next.Next = &ListNode{Val: 3}
    head.Next.Next.Next = &ListNode{Val: 4}
    head.Next.Next.Next.Next = &ListNode{Val: 5}

    // 逆转链表
    newHead := reverseList(head)

    // 打印逆转后的链表:5 -> 4 -> 3 -> 2 -> 1
    current := newHead
    for current != nil {
        fmt.Printf("%d -> ", current.Val)
        current = current.Next
    }
    fmt.Println("nil")
}

在这里插入图片描述

在这里插入图片描述

360智脑:

以下是一个使用go语言实现对单链表进行逆转的O(n)时间非递归过程:

package main

import "fmt"

// 定义链表节点结构体
type ListNode struct {
    Val  int
    Next *ListNode
}

// 定义链表类
class List {
    constructor() {}
    reverseList(head: *ListNode) -> *ListNode {
        var prev *ListNode = head
        var current *ListNode = head.Next
        while current != nil {
            var next *ListNode = current.Next
            current.Next = prev
            prev = current
            current = next
        }
        head.Next = prev
        return head
    }
}

// 测试
var list = new List()
list.add(1)
list.add(2)
list.add(3)
list.add(4)
list.add(5)

fmt.Println("原链表:")
printList(list.head)

list.reverseList(&list.head)

fmt.Println("逆转后的链表:")
printList(list.head)

其中,List是链表类,reverseList是反转链表的方法。在reverseList方法中,我们使用两个指针prevcurrent分别指向链表的头节点和当前节点,然后遍历整个链表,每次将当前节点的下一个节点赋值给当前节点,并将当前节点的指针指向前一个节点,最后返回头节点即可。

在这里插入图片描述

在这里插入图片描述

智谱清言:

package main
import (  
	"fmt"  
)
type ListNode struct {  
	Val  int  
	Next *ListNode  
}
func reverseList(head *ListNode) *ListNode {  
	var prev *ListNode  
	current := head  
	for current != nil {  
		nextTemp := current.Next  
		current.Next = prev  
		prev = current  
		current = nextTemp  
	}  
	return prev  
}
func printList(head *ListNode) {  
	for head != nil {  
		fmt.Print(head.Val, "->")  
		head = head.Next  
	}  
	fmt.Println("nil")  
}
func main() {  
	head := &ListNode{Val: 1, Next: &ListNode{Val: 2, Next: &ListNode{Val: 3, Next: &ListNode{Val: 4, Next: &ListNode{Val: 5, Next: nil}}}}}  
	fmt.Println("Original list:")  
	printList(head)
	reversedHead := reverseList(head)  
	fmt.Println("Reversed list:")  
	printList(reversedHead)  
}

这个程序首先定义了一个 ListNode 结构体,用于表示链表的节点。reverseList 函数接受一个链表的头节点作为参数,并返回逆转后的链表的头节点。

reverseList 函数中,我们使用了一个前置节点 prev,初始值为 nil。我们从链表的头节点开始,遍历链表的每个节点。对于每个节点,我们保存其下一个节点(nextTemp),然后将当前节点的前置节点设置为 prev,将当前节点设置为下一个节点,继续遍历。当遍历到链表的尾部时,currentnextTemp 都为 nil,此时我们将 prev 作为链表的新头节点返回。

printList 函数用于打印链表。我们在 main 函数中创建了一个示例链表,然后调用 reverseList 函数对其进行逆转,并打印原始链表和逆转后的链表。

在这里插入图片描述

在这里插入图片描述

通义千问:

以下是使用Go语言实现的非递归方法,用于逆转一个含n个元素的单链表:

package main

import "fmt"

type ListNode struct {
    Val int
    Next *ListNode
}

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

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

    return prev
}

func main() {
    head := &ListNode{Val: 1}
    head.Next = &ListNode{Val: 2}
    head.Next.Next = &ListNode{Val: 3}
    head.Next.Next.Next = &ListNode{Val: 4}
    head.Next.Next.Next.Next = &ListNode{Val: 5}

    fmt.Println("Original List:")
    for curr := head; curr != nil; curr = curr.Next {
        fmt.Printf("%d ", curr.Val)
    }

    newHead := reverseList(head)

    fmt.Println("\nReversed List:")
    for curr := newHead; curr != nil; curr = curr.Next {
        fmt.Printf("%d ", curr.Val)
    }
}

在这个程序中,我们使用三个指针:prev,curr和next。prev指针初始化为nil,curr指针初始化为链表的头节点。然后,我们进入一个循环,该循环在curr不为nil时继续运行。在每次迭代中,我们都做以下操作:

1.将next指针设置为curr的下一个节点。

2.将curr的next指针设置为prev。

3.将prev和curr向前移动一位。

当我们完成循环时,prev指针将指向逆转后的链表的头节点。我们返回prev指针,这就是逆转后的链表的头节点。

注意,这个程序使用了常数大小的额外空间。

在这里插入图片描述

在这里插入图片描述

天工:

以下是使用 Go 语言实现 O(n) 时间复杂度的非递归方式逆转单链表的代码:

func reverseList(head *ListNode) *ListNode {
    var prev *ListNode = nil
    var curr *ListNode = head
    for curr != nil {
        next := curr.Next
        curr.Next = prev
        prev = curr
        curr = next
    }
    return prev
}

该代码中,我们使用了三个指针,分别是 prevcurrnext。其中,prev 指向当前节点的前一个节点,curr 指向当前节点,next 指向当前节点的下一个节点。我们从头节点开始遍历链表,每次将当前节点的 next 指针指向 prev,然后更新 prevcurr 的值,继续遍历下一个节点。最后返回 prev 即可。

由于我们只需要常量级别的额外空间,因此空间复杂度为 O(1)。时间复杂度为 O(n),因为我们需要遍历整个链表一次。

在这里插入图片描述

chatgpt:

下面是一个使用Go语言实现对单链表逆转的非递归过程,时间复杂度为O(n):

package main

import "fmt"

type ListNode struct {
    Val  int
    Next *ListNode
}

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

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

    return prev
}

func displayList(head *ListNode) {
    current := head
    for current != nil {
        fmt.Printf("%d ", current.Val)
        current = current.Next
    }
    fmt.Println()
}

func main() {
    // 创建一个示例链表 1 -> 2 -> 3 -> 4 -> 5
    head := &ListNode{Val: 1}
    node2 := &ListNode{Val: 2}
    node3 := &ListNode{Val: 3}
    node4 := &ListNode{Val: 4}
    node5 := &ListNode{Val: 5}
    head.Next = node2
    node2.Next = node3
    node3.Next = node4
    node4.Next = node5

    fmt.Println("原链表:")
    displayList(head)

    reversedHead := reverseList(head)

    fmt.Println("逆转后的链表:")
    displayList(reversedHead)
}

这段代码定义了一个ListNode结构体来表示单链表节点,然后实现了reverseList函数来对单链表进行逆转。过程中使用了三个指针:prev用于表示当前节点的前一个节点,current用于表示当前节点,next用于保存下一个节点。我们对每个节点进行处理,将当前节点的下一个节点指向前一个节点,然后更新prevcurrentnext指针。最后返回逆转后的链表的头节点。

main函数中,创建了一个示例链表,并调用reverseList函数对其进行逆转。最后调用displayList函数来打印原链表和逆转后链表的值,以验证结果。

这个过程的空间复杂度为O(1),除了存储链表本身所需的空间外,只使用了固定大小的三个指针。

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1098441.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】:string用法详解

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数…

算法通过村第十四关-堆|黄金笔记|中位数

文章目录 前言数据流中的中位数的问题总结 前言 提示:我独自度过了太多的时光,沉默已成一种习惯。 帕瑞尔马卡姆《夜航西飞》 这个是一个比较难的题目,要不尝试一下看看。 数据流中的中位数的问题 参考题目地址:295. 数据流的中位…

身为程序员,你很有必要了解一下JNPF

一、JNPF是什么? JNPF是一个“低代码”的可视化编程平台,采用J2EE技术体系,基于Spring Boot框架封装的快速开发平台,包含多种开箱即用的功能,具备RBAC、自动生成代码、SaaS多租户等多个功能和模块。 JNPF,重…

真人现在猫鼠躲猫猫游戏搭建流程:专业思考与深度思考

真人现在猫鼠躲猫猫游戏是种充满乐趣和挑战的团队竞技游戏。本文将从游戏规则设计、场地布置、技术实现和用户体验等方面,深入探讨人现在猫鼠躲猫猫游戏的搭建流程,并结合专业思考与深度思考,为游戏搭建提供全面指导。 一、游戏规则设计&…

【uboot】Uboot的启动流程

引言 在驱动岗位上,每一位新员工刚入职期间都需要理解和掌握uboot,但深入的理解代码往往需要耗费大量的时间去反复阅读。本文希望对uboot进行尽可能详细的解析,帮助其他人更快的掌握和理解uboot源码。 准备工作 uboot源码 本文是基于Hi35…

Redux详解(二)

1. 认识Redux Toolkit Redux Toolkit 是官方推荐的编写 Redux 逻辑的方法。 通过传统的redux编写逻辑方式,会造成文件分离过多,逻辑抽离过于繁琐(具体可看上篇文章 Redux详解一),React官方为解决这一问题,推…

【设计模式】单例模式、“多例模式”的实现以及对单例的一些思考

文章目录 1.概述2.单例模式实现代码2.1.饿汉式单例2.2.懒汉式单例2.3.双检锁单例2.4.静态内部类单例2.5.枚举单例 3.对单例的一些思考3.1.是否需要严格的禁止单例被破坏?3.2.懒汉式真的比饿汉式更佳吗?3.3.单例存在的问题 4.其他作用范围的单例模式4.1.线…

空调原理与结构、制冷剂类型及相关先进技术

一、空调相关知识 1. 空调定义 空调是指利用各种技术和设备对某一空间内空气的温度、湿度、洁净度和流速进行调节,以满足人们对舒适性要求或不同工艺环境要求。 2. 基本原理 蒸发吸热、冷凝放热 压力越低沸点越低 3. 空调主要结构 空调主要由压缩机、冷凝器、…

求臻医学:MRD的十八般武艺 AI双驱动流派

作为专注于肿瘤精准诊疗领域的国家高科技企业,求臻医学依托《中国肿瘤基因图谱计划》和《肿瘤精准医学大数据平台》项目,围绕肿瘤诊断监测、预后评估、肿瘤早筛、遗传筛查、药物研发服务等场景,开发了针对肺癌、结直肠癌、胃癌、前列腺癌等实…

【Qt高阶】Qt D-Bus 简介【2023.10.16】

Qt D-Bus介绍 简介总线技术名词消息(阐述总线的消息内涵)服务名对象路径接口备忘表(便于记住名字的格式)调试 麒麟V10 与D-Bus 简介 D-Bus 是一个进程间通信(IPC)和远程过程调用(RPC)机制,最初是为了 Linux 开发,用来取代现有的竞争的 IPC 解决方案,提供…

交通部 EDI是什么?如何处理?

交通部于1996年开始实施《国际集装箱运输电子信息传输和运作系统及示范工程》,即在中国远洋运输集团、上海口岸、宁波口岸、天津口岸和青岛口岸建立 EDI 示范工程。 交通部 EDI 的数据结构 电子口岸或者其他物流企业需要确保能够生成和解析符合交通部要求的EDI数据…

两个pdf合并成一个pdf?

两个pdf合并成一个pdf?pdf合并是我们在处理PDF中非常常见的一个操作。我们看似有很多方法能够实现这一操作,但是真正适合自己的方法确实能够帮助我们很多。那么多方法的话,小编今天打算汇总几个比较适合新手的快速方法,这样效率更…

建立线上线下一体化营销体系,数字化营销系统必不可少

​在当今的市场环境中,实体行业想要取得持续的收入增长,必须将线上线下业务相结合,充分利用数字化营销系统的功能,以构建“全链路式”数字化营销体系。 而数字化营销系统中,常见的如分销系统、拼团系统、分红系统、积分…

mission planner通过串口连接3DR数传,远程飞控

前提 pixhaw2.4.8已布线,有单独的电源供电,通过电量计接power接口 电量计的输入端接24V电源,飞控的输入是5v电源,电量计上有个模块可以分压将5v的电输入到飞控 数传接在接口telem 2上(一个接飞控,一个接电…

用浏览器进行web应用测试,你会怎么做?

有没有遇到这样的一个场景:你在使用浏览器进行web应用测试,但是你想知道你在测试过程中的前端输出和后端响应的情况究竟如何。那么,你会怎么做呢?想必大多人会毫不犹豫地回答:通过浏览器console面板和network面板抓取信…

idea使用debug无法启动,使用run可以启动

1、将调试断点清除 使用快捷键ctrl shift F8,将勾选的选项去除即可 2、Error running SampleApplication: Command line is too long. Shorten command line for SampleApplication or also for Spring Boot default configuration,报这种错误&#x…

信号完整性分析基础知识之有损传输线、上升时间衰减和材料特性(五):有损传输线的特性阻抗和信号传输速度

有损传输线的特性阻抗 理想有损传输线特性阻抗是和频率相关的,很复杂。可以有以下公式: 按照代数知识,特性阻抗的实部和虚部如下: 其中RL表示单位长度导体的串联电阻 CL表示单位长度电容 LL单位长度串联环路电感 GL电介质单位长度…

番茄小说推文怎么申请授权?

以下为申请步骤 1.使用“巨量推文” 2.找到番茄小说这个小说app 3.按照要求申请关键词 完成以上步骤即可申请番茄小说推文关键词授权

前端新特性:Compute Pressure API!!!

前几天,review 同事代码的时候发现了一个新的 JS API PressureObserver。 通过一番搜索,发现这个 API 是 Compute Pressure API 的一部分。 Compute Pressure API:https://www.w3.org/TR/compute-pressure/ 它的作用是可以观察 CPU 的变…

yolov8如何进行训练验证推理

1、新建脚本main.py,也可以建一个yaml文件(避免改到default.yaml),这个yaml文件是在训练时用到 batchsize什么的都可以在yaml文件改,这俩东西不用填 2、两种训练的方法,用的时候可以注释掉其他 from u…