我正在尝试解决Go中的leetcode问题来自学语言。我有一个链表和一个插入函数:
type ListNode struct {
Val int
Next * ListNode
}
func Insert(listNode * ListNode, i int) {
// @fixme how to check the first node?
if listNode == nil {
listNode.Val = i
listNode.Next = nil
} else {
for;;
listNode = listNode.Next {
if listNode.Next == nil {
listNode.Next = & ListNode {
i, nil
}
break
}
}
}
}
func main() {
vals: = [] int {
1, 2, 3, 4, 5
}
var list ListNode
for _,
i: = range vals {
Insert( & list, i)
}
}
问题是当实例化ListNode的实例时,struct字段的值为零,我无法更新列表的第一个元素,因为我无法检查它。换句话说,ListNode项已初始化但为空。因此,当我想构建一个列表1->2->3->4->5
时,我最终得到:0->1 ->2 ...5
。限制是我无法更改结构定义,因为leetcode已经定义了。
以下是上述代码的工作示例:
https://play.golang.org/p/bIz-VjY1PS7
答案 0 :(得分:1)
你应该做的是你不应该使用ListNode
你应该使用*ListNode
,这样一个空列表由nil
*ListNode
表示:< / p>
func New() *ListNode {
return nil
}
func Insert(listNode *ListNode, i int) *ListNode {
// If it's nil, create it
if listNode == nil {
listNode = &ListNode{i, nil}
} else {
l := listNode
for ; l.Next != nil; l = l.Next {
}
l.Next = &ListNode{i, nil}
}
return listNode
}