Удаление элемента в связанном списке с помощью Go - PullRequest
0 голосов
/ 02 июня 2019

Я хочу удалить Node из связанного списка в Go, и у меня есть эта структура и эти методы:

type Node struct {
    Next *Node
    Val  int
}

func (n *Node) Append(val int) {
    end := &Node{Val: val}
    here := n
    for here.Next != nil {
        here = here.Next
    }
    here.Next = end
}

func Remove(n *Node, val int) *Node {
    head := n
    for head.Next != nil {
        if head.Next.Val == val {
            head.Next = head.Next.Next
            return head
        }
        head = head.Next
    }
    return head
}

func NewNode(val int) *Node {
    return &Node{Val: val}
}

Я хочу удалить элемент, подобный этому:


n := NewNode(1)
n.Append(2)
n.Append(3)
n.Append(4)
n.Append(5)

m := Remove(n, 3)

for m != nil {
    fmt.Println(n.Val)
    m = m.Next
}

Распечатываются следующие элементы: 3 и 5, а не 1, 2 , 4 and 5`.Я повторно реализовал этот код в Python и получил ожидаемый ответ.Что происходит в Go?У меня такое чувство, что это связано с указателями.

1 Ответ

2 голосов
/ 02 июня 2019

Вы теряете голову, возвращая узел, который используете для прохождения.Также вы печатаете не тот объект

type Node struct {
    Next *Node
    Val  int
}

func (n *Node) Append(val int) {
    end := &Node{Val: val}
    here := n
    for here.Next != nil {
        here = here.Next
    }
    here.Next = end
}

func Remove(n *Node, val int) *Node {
    traverser := n
    for traverser.Next != nil {
        if traverser.Next.Val == val {
            traverser.Next = traverser.Next.Next
            return n
        }
        traverser = traverser.Next
    }
    return n
}

func NewNode(val int) *Node {
    return &Node{Val: val}
}

func main() {
    n := NewNode(1)
    n.Append(2)
    n.Append(3)
    n.Append(4)
    n.Append(5)

    m := Remove(n, 3)

    for m != nil {
        fmt.Println(m.Val)
        m = m.Next
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...