Golang указатель не обновляется при передаче методу как nil - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь создать линейный связанный список в go с рекурсивными функциями, но по какой-то причине я не получаю правильный результат.

Когда я добавляю число в список, я заметил, что 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()
}

1 Ответ

2 голосов
/ 25 мая 2020

List.Add не обновляет L.head. Вы передаете L.head в recursiveAdd, но то, что вы передаете, является копией L.head, которая равна нулю, и когда вы присваиваете ему значение, вы обновляете только копию указателя в стеке, а не 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
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...