使用 Go 删除​​链接列表中的项目

AAA*_*AAA 3 go

我想Node从 Go 中的链表中删除 a,我有这个结构体和这些方法:

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}
}
Run Code Online (Sandbox Code Playgroud)

我想删除这样的项目:


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
}

Run Code Online (Sandbox Code Playgroud)

打印出来的项目是35,而不是1,2 ,4 and5`。我用 Python 重新实现了这段代码并得到了预期的答案。Go 中发生了什么?我有一种感觉,它必须与指针做一些事情。

小智 6

返回用于遍历的节点会丢失头部。您还打印出错误的对象

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
    }
}
Run Code Online (Sandbox Code Playgroud)