我想制作一个单独链接的列表,并将每个数据插入头中。我写了下面的代码,但我不知道为什么它会给我错误的结果。
type ListNode struct {
val interface{}
Next *ListNode
}
func New(n int) *ListNode {
node := &ListNode{val: n}
return node
}
func (head *ListNode) Print() {
for head != nil {
fmt.Println(head.val)
head = head.Next
}
}
func (head *ListNode) AddToFirst(n int) {
newHead := &ListNode{val: n}
newHead.Next = head
head = newHead
}
这是我的测试数据
node := New(4)
node.AddToFirst(5)
node.AddToFirst(8)
node.AddToFirst(10)
node.Print()
当我的输入是时
4、5、8、10
我想要输出
10、8、5、4
我希望你能帮我解释为什么会出现这种情况。我不明白为什么?我使用指针来添加值,而不使用引用类型。
问题出现在AddToHead
中,特别是:
head = newHead
head
变量是指向头部的指针。将head
分配给newHead
时,用于调用AddToHead
的node
变量不会更改,node
变量(即head
(的副本也会更改。所以你从来没有真正更新过头脑。
解决这个问题的一种方法是返回新的头:
func (head *ListNode) AddToFirst(n int) *ListNode {
newHead := &ListNode{val: n}
newHead.Next = head
return newHead
}
并使用它:
node := New(4)
node=node.AddToFirst(5)
node=node.AddToFirst(8)
node=node.AddToFirst(10)
node.Print()
您应该首先定义一个Node结构类型,然后定义一个ListNode结构类型。。。类似于:
type Node struct {
val int
next *Node
}
type ListNode struct {
head *Node
}
那么,你的AddToFirst是显而易见的:
func (list *ListNode) AddToFirst(n int) {
list.head = &Node{val: n, next: list.head}
}
小心你的Print((函数:它不应该修改列表,只应该迭代它
我更改了代码。
func AddToHead(head **ListNode, n int) {
newHead := &ListNode{val: n}
newHead.Next = *head
*head = newHead
}
调用方法
node := New(4)
AddToHead(&node, 5)
AddToHead(&node, 8)
AddToHead(&node, 10)