为什么这个链表不添加新节点?



我想制作一个单独链接的列表,并将每个数据插入头中。我写了下面的代码,但我不知道为什么它会给我错误的结果。

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时,用于调用AddToHeadnode变量不会更改,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)

相关内容

  • 没有找到相关文章

最新更新