gpt4 book ai didi

data-structures - 链表实现的指针问题

转载 作者:数据小太阳 更新时间:2023-10-29 03:07:00 24 4
gpt4 key购买 nike

尝试使用简单的 addToLast 函数(将新节点添加到链表的末尾)而不是使用内置列表来实现 LinkedList)下面是代码(删除了我用于调试的打印语句):

package main

import "fmt"

var first *Link
var last Link

func main() {
AddToLast(10)
AddToLast(20)
}

func AddToLast(d int) {
if first == nil {
last = Link{d, new(Link)}
first = &last
} else {
last.next = &Link{d, new(Link)}
last = *last.next
}
}

type Link struct {
data int
next *Link
}

我对上面代码的理解:

内部 AddToLast 函数 -在检查 'first' 是否为 nil 后,即它没有任何元素,'last' 被创建以 10 作为数据,新的空链接作为下一个。现在 'first' 被赋予相同的值作为“最后”但使用内存地址(作为引用 - 我不确定我的理解是否不正确)

现在,当我们尝试插入 20(下一个新元素)时,将执行“AddToLast”中的 else 部分。'last.next' 被分配了一个值为 20 的链接,它的 next 为 nil。现在'last'被移动到'last.next',确保“last”始终指向最后一个节点。

然而,自从我将“last”移动到“last.next”后,“last”('s) 的内存地址发生了明显的变化,这也是导致 first 指向新的 last,即值为 20。

为了避免这种情况,我尝试将“first”声明为 Link 而不是 *Link。但是,这样做并不能使 first.next 指向新节点,即 20。我很困惑我的想法不正确。

最佳答案

不要改变 last 中的元素值,因为该元素已经创建。新建一个last,并将之前的next指针指向它。这是修改后的版本:http://play.golang.org/p/-X5RayC0gU

var first *Link
var last *Link

func AddToLast(d int) {
next := &Link{d, nil}
if first == nil {
first = next
} else {
last.next = next
}
last = next
}

type Link struct {
data int
next *Link
}

关于data-structures - 链表实现的指针问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30128531/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com