我很新,去杀虫来实现链表。这是我的源代码
package main
import "fmt"
type Node struct {
value int
next *Node
}
func main() {
var head *Node
for i := 1; i <= 10; i++ {
insert(&head, i)
}
print_list(head)
}
func print_list(node_pointer *Node) {
if (node_pointer == nil) {
return
} else {
node := *node_pointer
fmt.Printf("%dn", node.value)
print_list(node.next)
}
}
func insert(node_pointer **Node, // pointer to a pointer to a Node
value int) {
var new_node Node
new_node.value = value
if (*node_pointer == nil) {
fmt.Printf("Empty listn")
*node_pointer = &new_node
} else {
var cur_node Node = **node_pointer
for cur_node.next != nil {
cur_node = *cur_node.next
}
cur_node.next = &new_node
fmt.Printf("Add %dn", (*cur_node.next).value) }
}
输出为:
Empty list
Add 2
Add 3
Add 4
Add 5
Add 6
Add 7
Add 8
Add 9
Add 10
1
换句话说,我不能在链表的末尾插入一个新的节点。我相信这是由仅在本地进行更新cur_node.next = &new_node
引起的,但不知道如何解决此问题。
问题出在您的插入函数中 - 这是一个更正的版本
func insert(node_pointer **Node, // pointer to a pointer to a Node
value int) {
var new_node Node
new_node.value = value
if *node_pointer == nil {
fmt.Printf("Empty listn")
*node_pointer = &new_node
} else {
var cur_node *Node = *node_pointer
for cur_node.next != nil {
cur_node = cur_node.next
}
cur_node.next = &new_node
fmt.Printf("Add %dn", (*cur_node.next).value)
}
}
操场
您的错误是因为您获得的是节点值,而不是此处的指针:
var cur_node Node = **node_pointer
*note_pointer
是指向列表头部的指针,但是你使用的是**node_pointer
,然后你得到这个值,然后把这个值复制到cur_node
,之后新节点会被追加到cur_node
,与头节点无关。所以当你打印表单头节点时,你只能获取头节点的值。
固定解决方案就像克雷格-伍德@Nick说的那样。