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

时间:2019-06-02 03:31:19

标签: go

我想从Go的链接列表中删除Node,并且具有以下结构和这些方法:

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
}

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

1 个答案:

答案 0 :(得分:1)

由于返回用于遍历的节点而失去了头部。另外,您打印出错误的对象

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
    }
}
相关问题