尝试使用简单的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的链接,下一个为nil。现在'last'被移到'last.next', 确保'last'始终指向最后一个节点。
然而,因为我将'last'移动到'last.next','last'('s)内存地址的变化很明显,这也是 导致首先指向新的最后一个,即值为20.
为了避免这种情况,我尝试将'first'声明为Link而不是* Link。 但是,这样做不会使first.next指向新节点,即20.我对于我认为不正确的地方感到困惑。
答案 0 :(得分:2)
不要改变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
}