gpt4 book ai didi

pointers - Golang指针反向链表混淆

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

我是 Golang 的新手,对指针在这里的工作方式有点困惑,我以反向链表问题为例。

func reverseList(head *ListNode) *ListNode {
var prev *ListNode = nil
for {
if head == nil {
break
}
temp := head
head = head.Next
temp.Next = prev
prev = temp
}
return prev
}

在这种情况下,temphead 指向相同的内存位置。但是,如果我将行 temp.Next = prev 放在 head = head.Next 之前,head.Next 将指向 nil。

当我们说 temp.Next = prev 时,幕后发生了什么。我们是说 temp 指向的结构现在已更改,因此如果我将该行放在 head = head.Next 上面,那么 head 现在也指向这个改变的结构?

我想为了改变 head.Next 的实际值,我们必须取消引用它吗?

我有点困惑为什么这行不通

func reverseList(head *ListNode) *ListNode {
var prev *ListNode = nil
for {
if head == nil {
break
}
temp := head
temp.Next = prev
prev = temp
head = head.Next <--- CHANGED ORDERING HERE
}
return prev
}

最佳答案

它不会工作,因为你要使 head 无效在第一次迭代中。流程如下:

temp := head   
// Since temp is a pointer, any modifications made to it will also
// impact head. So when you set temp.Next here, you're also setting
// head.Next. Since prev is always nil on the first iteration, you've
// set head.Next = nil.
temp.Next = prev
prev = temp
// This will set head to nil, always.
head = head.Next

在正确的版本中,更新head = head.Next在任何写入发生之前,它意味着您已经移动到下一个元素,因此覆盖该值是安全的。

实际上,第二个版本所做的是删除列表中除第一个元素之外的所有元素。如果您在调用此函数之前没有引用第二个元素,那么它们现在处于不确定状态,将被垃圾回收。

根据评论更新:
当你做类似 temp := head 的事情时,你说的是“创建一个名为 temp 的指针,并将其指向与 head 指向的同一对象。”如果你然后修改 temp 的东西指向(例如,执行 temp.Next = prev )您还将在读取 head 的数据时看到更改指向 因为它仍然指向同一个地方。

当您执行 head = head.Next 时你说的是“更新 head 以指向 head.Next 指向的任何地方。”这更新了 head本身而不是它指向的数据,因此您不会看到与 temp 相关的任何更改.

这里是学习更多关于指针的好资源:https://dave.cheney.net/2017/04/26/understand-go-pointers-in-less-than-800-words-or-your-money-back

关于pointers - Golang指针反向链表混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50052636/

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