首页 > 编程语言 >文心一言 VS 讯飞星火 VS chatgpt (114)-- 算法导论10.2 7题

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

时间:2023-10-16 17:32:05浏览次数:29  
标签:head 10.2 ListNode Next 链表 VS 文心 prev 节点

七、用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),因为它需要遍历链表的每个节点。

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

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

讯飞星火:

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")
}

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

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

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分别指向链表的头节点和当前节点,然后遍历整个链表,每次将当前节点的下一个节点赋值给当前节点,并将当前节点的指针指向前一个节点,最后返回头节点即可。

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

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

智谱清言:

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 函数对其进行逆转,并打印原始链表和逆转后的链表。

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

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

通义千问:

以下是使用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指针,这就是逆转后的链表的头节点。

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

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

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

天工:

以下是使用 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),因为我们需要遍历整个链表一次。

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

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),除了存储链表本身所需的空间外,只使用了固定大小的三个指针。

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

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

标签:head,10.2,ListNode,Next,链表,VS,文心,prev,节点
From: https://blog.51cto.com/moonfdd/7887389

相关文章

  • Vsto识别wps和office
       我们要开发wps插件了。之前用vsto开发过word插件,我也讲过c#下如何开发wps插件(有点繁琐)。如果采用c#从头再开发wps插件,那么开发出来的office加载项就会出现两个。我们要实现的wps和word插件一致的功能。office加载项如图所示:如何才能够让office和wps插件兼容呢?也就是说一......
  • 在vscode中将markdown文件导出为pdf
    首先安装插件:然后在md文件中右键,选择如图所示选项跳转到预览界面之后,右键依次选择如图所示选项导出完成,pdf文件与md文件在同一文件目录下。......
  • VSCode 配置C++环境
    MinGW肯定要装的。复制json这篇就够了,但终端会闪掉:VsCode安装和配置c/c++环境(超完整,小白专用)_vscodec++环境-CSDN博客这篇文章配终端:VSCode中C/CPP的完美配置(完成环境搭建、解决终端自动闪退、解决无法调试)-知乎(zhihu.com)......
  • cygwin works with vs code
    Incasesomeonestumblesonthisthread.ThereisabuginCygwin'sgdb(v11.x-v12.x)thatpreventsVSCodefromstoppingatbreakpoints.Atthemomentrollingbackgdbtov9.xseemstosolvetheissue.Currently,thegcc/g++versionisgcc(GCC)1......
  • 一周总结(2023.10.2-2023.10.15)
    2023.10.2考试。T1是简单的,T2是一个比较简单的dp,状态等东西都是对的,但是因为有一个地方没有取模而只交了暴力。受不鸟。T3是概率dp,考场上想了比较久想出来并实现了。T4是一个容斥计数题,大概理解了但是没有补。考场上千万要注意细节,以免丢掉不该丢的分。2023.10.3还是考试......
  • 文心一言 VS 讯飞星火 VS chatgpt (113)-- 算法导论10.2 5题
    五、用go语言,使用单向循环链表实现字典操作INSERT、DELETE和SEARCH,并给出所写过程的运行时间。文心一言:在Go语言中,我们首先需要定义一个Node结构体来表示单向循环链表的节点,然后再定义一个LinkedList结构体来表示单向循环链表。接下来,我们可以实现INSERT、DELETE和SEARCH操作。......
  • 文心一言 VS 讯飞星火 VS chatgpt (113)-- 算法导论10.2 5题
    五、用go语言,使用单向循环链表实现字典操作INSERT、DELETE和SEARCH,并给出所写过程的运行时间。文心一言:在Go语言中,我们首先需要定义一个Node结构体来表示单向循环链表的节点,然后再定义一个LinkedList结构体来表示单向循环链表。接下来,我们可以实现INSERT、DELETE和SEARCH操作......
  • exsi上新增加了 几块硬盘 需要在VSPHERE上面添加上去
    新加入的硬盘要配置为Raid0.进入Bios,配置Raid0;保存重启。1)登录VS client2)点击配置储存3)点击右上角那个添加储存器,根据提示一步步添加就可以了!添加之后配置VSclient。在client中为虚拟机添加新的硬盘(虚拟磁盘),新的硬盘必须要指定到新的硬盘上(这点很重要)。配置完成......
  • 解决VS Code/Code insiders右键python代码无法“转到定义”问题
    最近怀疑自己用了个假的VSCode,同门的能丝滑跳转定义、跳转引用,自己的偏偏不行(合着这么爽的功能我从来没享受到(。﹏。*)),网上各种教程试了个遍都不行,最后自己摸索出了解决方案。记录在此备忘:按以下顺序依次Check:确保安装这些插件:Python、Pylance、IntelliCode(用远程服......
  • vscode配置git仓库
    本文将详细介绍如何在VSCode中配置Git仓库,以及如何利用这一功能来管理您的代码版本、协作开发和提高工作效率。让我们一起揭开这个主题的神秘面纱,探索编程世界的新奇之处!第一步:安装Git和VSCode在开始之前,您需要确保已经安装了Git和VSCode。Git是一个分布式版本控制系统,而VSCode则是......