尝试使用简单的 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' 被分配与 'last' 相同的值,但使用内存地址(作为参考 - 我不确定我的理解在这里是否不正确)
现在,当我们尝试插入 20(下一个新元素)时,将执行“AddToLast”中的 else 部分。'last.next' 被分配一个值为 20 的链接,其次为 nil。现在'last' 被移动到'last.next',以确保'last' 总是指向最后一个节点。
但是,由于我将“last”移动到“last.next”,“last”('s) 内存地址发生了明显变化,这也导致 first 指向新的 last,即值为 20。
为了避免这种情况,我尝试将“first”声明为 Link 而不是 *Link。但是,这样做不会使 first.next 指向新节点,即 20。我很困惑我认为哪里不正确。
相关分类