Почему этот связанный список не добавляет новые узлы? - PullRequest
0 голосов
/ 24 марта 2020

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

type ListNode struct {
    val  interface{}
    Next *ListNode
}

func New(n int) *ListNode {
    node := &ListNode{val: n}
    return node
}

func (head *ListNode) Print() {
    for head != nil {
        fmt.Println(head.val)
        head = head.Next
    }
}

func (head *ListNode) AddToFirst(n int) {
    newHead := &ListNode{val: n}
    newHead.Next = head
    head = newHead
}

Это мои тестовые данные

node := New(4)
node.AddToFirst(5)
node.AddToFirst(8)
node.AddToFirst(10)
node.Print()

Когда мой ввод

4, 5, 8, 10

Я хочу вывод

10, 8, 5, 4

Я надеюсь, что вы можете помочь мне объяснить, почему это так. Я не понимаю почему? Я использую указатели для добавления значений и не использую ссылочные типы.

Ответы [ 3 ]

2 голосов
/ 24 марта 2020

Проблема в AddToHead, в частности:

 head = newHead

Переменная head - это указатель, указывающий на голову. Когда вы присваиваете head для newHead, переменная node, которую вы использовали для вызова AddToHead, не изменяется, изменяется копия переменной node (то есть head). Таким образом, вы никогда не обновляете голову.

Один из способов исправить это - вернуть новую голову:

func (head *ListNode) AddToFirst(n int) *ListNode {
    newHead := &ListNode{val: n}
    newHead.Next = head
    return newHead
}

И использовать ее:

node := New(4)
node=node.AddToFirst(5)
node=node.AddToFirst(8)
node=node.AddToFirst(10)
node.Print()
0 голосов
/ 25 марта 2020

Сначала вы должны определить структурный тип Node, затем определить структурный тип ListNode ... Что-то вроде:

type Node struct {
   val int
   next *Node
}

type ListNode struct {
   head *Node
}

, тогда ваш AddToFirst очевиден:

func (list *ListNode) AddToFirst(n int) {
   list.head = &Node{val: n, next: list.head}
}

Осторожно вашей функции Print (): он не должен изменять список, а только повторять его.

0 голосов
/ 25 марта 2020

Я изменил свой код.

func AddToHead(head **ListNode, n int) {
    newHead := &ListNode{val: n}
    newHead.Next = *head
    *head = newHead
}

Метод вызова

    node := New(4)
    AddToHead(&node, 5)
    AddToHead(&node, 8)
    AddToHead(&node, 10)
...