我是 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
}
在这种情况下,temp 和 head 指向相同的内存位置。但是,如果我将行 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/
>>a=5=>5>>b=a=>5>>b=4=>4>>a=>5如何将“b”设置为实际的“a”,以便在示例中,变量a也将变为4。谢谢。 最佳答案 classRefdefinitializeval@val=valendattr_accessor:valdefto_s@val.to_sendenda=Ref.new(4)b=aputsa#=>4putsb#=>4a.val=5putsa#=>5putsb#=>5当您执行b=a时,b指向与a相同的对象(它们具有相同的object_id).当你执行a=some_other_thing时,a将指向
我在Ruby中遇到了一个关于Dir[]和File.join()的简单程序,blobs_dir='/path/to/dir'Dir[File.join(blobs_dir,"**","*")].eachdo|file|FileUtils.rm_rf(file)ifFile.symlink?(file)我有两个困惑:首先,File.join(@blobs_dir,"**","*")中的第二个和第三个参数是什么意思?其次,Dir[]在Ruby中有什么用?我只知道它等价于Dir.glob(),但是,我对Dir.glob()确实不是很清楚。 最佳答案
请有人帮助我了解ruby应用程序如何管理应用程序的gemfile和rvmgemsets。如果我当前使用的是Gemset,安装了一堆gem,并且我的gemfile中也有gems,那么Ruby应用程序是使用gemfile中的gem还是应用程序的gemset中的gem? 最佳答案 要理解这一点,您需要退后一步,了解rubygems的一般工作原理。让我们从一个没有rvm或Gemfile的系统开始。当您通过“geminstall”安装gem时,它会进入系统gem位置。每当您编写ruby脚本并需要gem时,它就会从那里获取。现在假设
给定一个最小整数和最大整数,我想创建一个数组,它从最小值到最大值以二为单位计数,然后倒退(再次以二为单位,重复最大数)。例如,如果最小数是1,最大数是9,我想要[1,3,5,7,9,9,7,5,3,1].我试图尽可能简洁,这就是我使用单行代码的原因。在Python中,我会这样做:range(1,10,2)+range(9,0,-2)在我刚刚开始学习的Ruby中,到目前为止我所想到的是:(1..9).inject([]){|r,num|num%2==1?r这行得通,但我知道必须有更好的方法。这是什么? 最佳答案 (1..9).step
我对Ruby中的对象分配和指针有点困惑,编写了这段代码来测试我的假设。classFooattr_accessor:one,:twodefinitialize(one,two)@one=one@two=twoendendbar=Foo.new(1,2)beans=barputsbarputsbeansbeans.one=2putsbarputsbeansputsbeans.oneputsbar.one我曾假设,当我将bar分配给beans时,它会创建该对象的副本,并且修改一个不会影响另一个。唉,输出显示不是这样。^_^[jergason:~]$rubytest.rb####22我相信这些
我正在使用Gosugem进行一些图形编程。问题是,当我创建一个窗口时,我的鼠标指针被隐藏了。我可以猜到鼠标在某个时刻的位置,我可以凭直觉点击,但我的用户可能不会。如何显示指针? 最佳答案 如果你想使用系统光标你可以这样做classWindow查看libgosu的文档RubyGosurdocReference/Window 关于ruby-为什么Gosu隐藏我的鼠标指针?,我们在StackOverflow上找到一个类似的问题: https://stackoverf
前文,我们实现了认识了链表这一结构,并实现了无头单向非循环链表,接下来我们实现另一种常用的链表结构,带头双向循环链表。如有仍不了解单向链表的,请看这一篇文章(7条消息)【数据结构和算法】认识线性表中的链表,并实现单向链表_小王学代码的博客-CSDN博客目录前言一、带头双向循环链表是什么?二、实现带头双向循环链表1.结构体和要实现函数2.初始化和打印链表3.头插和尾插4.头删和尾删5.查找和返回结点个数6.在pos位置之前插入结点7.删除指定pos结点8.摧毁链表三、完整代码1.DSLinkList.h2.DSLinkList.c3.test.c总结前言带头双向循环链表,是链表中最为复杂的一种结
我们可以像这样在顶层调用Array方法Array(something)这对我来说很有意义,它是一个没有显式接收者的方法调用,并且在本例中是main的self被插入到方法调用的前面。但这不是等同于:Kernel.Array(something)这对我来说没有意义。由于在第一种情况下,对象main属于Object类,其中混入了Kernel模块,因此具有Array方法。但是在第二种情况下,我们在内核模块对象本身而不是主对象上调用Array方法,它们不是一回事吗?抱歉我的英语不好。 最佳答案 Kernel.Array是所谓的模块函数。模块函
我对Ruby的运算符感到困惑。它与==或===有何不同?任何综合示例/用例?谢谢。 最佳答案 是组合比较运算符。如果LHS等于RHS,则返回0;如果LHS大于RHS,则返回1;如果LHS小于RHS,则返回-1 关于ruby-与Ruby的运算符混淆,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4746129/
这个问题在这里已经有了答案:Rubyobfuscator[duplicate](3个答案)关闭9年前。我必须混淆ruby代码以隐藏敏感源。我需要朝着正确的方向前进才能实现我想要的,所以:是否有Python的pyc的Ruby替代品?,我在许多gem中看到了version.rbc文件。它是如何产生的?此过程是否适用于其他(复杂的,而不仅仅是简单的版本声明)类型的Ruby文件?RubyEncoder可以完成这项工作(可以吗?帮我解决这个问题),但它需要购买许可证。这就是为什么我会将其视为最后的手段。任何其他建议