Проблема 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 . Это дает преимущество что пользователю не нужно понимать, как хранится список.