猿问

链表实现的指针问题

尝试使用简单的 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。我很困惑我认为哪里不正确。


临摹微笑
浏览 143回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答