以 nil 形式传递给方法时,Golang 指针未更新

我正在尝试使用递归函数创建一个线性链表,但由于某种原因,我没有得到正确的结果。


当我向列表中添加一个数字时,我注意到L.head该方法返回后从未更新过recursiveAdd。鉴于它是一个指针,不应该更新它吗?


之后的预期结果list.Display():1 2 3


实际结果:空字符串


package main


import "fmt"


type Node struct {

    num int

    next *Node

}


type List struct {

    head *Node

}


func (L *List) Add(n int) {

    L.recursiveAdd(L.head, n)

}


func recursiveAdd(node *Node, n int){

    if node == nil {

        node = &Node{n, nil}

        return

    }

    L.recursiveAdd(node.next, n)

}


func (L *List) Display() {

    recursiveDisplay(L.head)

}


func recursiveDisplay(n *Node){

    if n == nil {

        return

    }

    fmt.Println(n.num)

    recursiveDisplay(n.next)

}


func main(){

    list := List{}


    list.Add(1)

    list.Add(2)

    list.Add(3)


    list.Display()

}


犯罪嫌疑人X
浏览 86回答 1
1回答

德玛西亚99

List.Add不更新L.head。您传递L.head给recursiveAdd,但您传递的是 的副本L.head,即 nil,当您为其分配值时,您只会更新堆栈上指针的副本,而不是L.head. 你可以做:func (L *List) Add(n int) {    l.head=L.recursiveAdd(L.head, n)}func (L *list) recursiveAdd(node *Node, n int) *Node{    if node == nil {        node = &Node{n, nil}        return node    }    node.next=L.recursiveAdd(node.next,n)    return node}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go