Обновление значения в методе получения указателя, но значение не обновляется - PullRequest
0 голосов
/ 01 февраля 2020

Я реализую связанный список в Go. Я написал метод для вставки узла в начало связанного списка:

func (n *node) insertAtBegining(d int){
    nn := &node{d,n}
    n = nn
}

Метод, являющийся получателем указателя, должен обновить узел n, но он не может этого сделать.

Например,

head.printList()
head.insertAtBegining(30)
head.printList()

возвращает

42 -> 56 -> 89 -> nil
42 -> 56 -> 89 -> nil

Вы можете увидеть полную реализацию в https://play.golang.org/p/rpI6lbAywOQ.

Что я делать неправильно?

1 Ответ

0 голосов
/ 01 февраля 2020

Проблема root заключается в том, что вызов head.insertAtBegining(30) не меняет значение head (он по-прежнему указывает на node{42, nil}).

Вы разработали это при условии, что n = nn в insertAtBegining обновит head, но это не так. Я думаю, что легче понять, если insertAtBegining является стандартной функцией, а не метод :

insertAtBegining(head, 30)
...
func insertAtBegining(n *node, d int) *node{
    nn := &node{d,n}
    n = nn
}

Поскольку Go передает все параметры по значению (вы можете передать указатель, но это передается как значение) Я думаю, что это не изменится head (если вы хотите сделать это, вам нужно определить функцию func insertAtBegining(n **node, d int) *node{ и передать ее &head.

. проблема в том же методе.

Самое простое решение - переопределить insertAtBegining как ( детская площадка ):

func (n *node) insertAtBegining(d int) *node{
    nn := &node{d,n}
    return nn
}

Теперь возвращается новый Таким образом, вы используете это как: head = head.insertAtBegining(30).

Другой подход заключается в инкапсуляции управления списками в структуре, это подход, принятый в list.List . Это дает преимущество что пользователю не нужно понимать, как хранится список.

...