3 回答
TA贡献1942条经验 获得超3个赞
append()返回下一个节点的指针。因此printList(),仅打印从下一个节点开始的节点。如果您想打印列表中的所有节点,您应该添加一个变量来存储引用该列表起始节点的指针。
func main() {
n := newNode(3)
head := n
head.printList()
n = n.append(4)
head.printList()
n = n.append(5)
head.printList()
n = n.append(6)
head.printList() // 3,4,5,6
}
TA贡献1863条经验 获得超2个赞
这个功能:
func (n *Node) append(val int) (*Node){
for n.next != nil {
n = n.next
}
n.next = newNode(val)
return n
}
一般不返回其原始参数。它返回(假设非空)列表中倒数第二个节点。因此:
n = n.append(4)
添加一个节点holding4到原始节点holding 3,然后返回原始节点holding 3,但是:
n = n.append(5)
将持有 的节点添加5到原始列表,但随后返回指向持有 的节点的指针4。这就是你4,5,现在看到的原因。出于同样的原因,后续调用会不断重复最后两个元素。
您可以修改您的append函数以保存原始返回值并返回该值:
func (n *Node) append(val int) *Node {
// find current tail
t := n
for t.next != nil {
t = t.next
}
t.next = newNode(val)
return n
}
但总的来说,这仍然不是一个很好的策略:例如,当给定-valued时,这append不起作用。考虑构建一个能够处理此类情况的列表类型。或者,正如Hsaio 的回答一样,您可以让调用者直接挂在头节点上。如果你这样做,你可以让函数返回尾指针:nilnappend
func (n *Node) append(val int) *Node {
n.next = newNode(val)
return n.next
}
然后像这样使用它:
head := newNode(3)
t := append(head, 4)
t = append(t, 5)
t = append(t, 6)
head.printList()
List(标准 Go 包中已经有一个container/list实现,它可以很好地为您完成这些工作。您可以创建一个整体列表容器实例,而不是直接指向列表中的每个元素,该实例允许您在前面插入, insert-at-back、remove-from-anywhere 等等。这有点尴尬,因为它用于interface{}数据,因此需要类型断言来获取每个节点的值。)
- 3 回答
- 0 关注
- 108 浏览
添加回答
举报