使用 golang 的列表中最后一个元素的第 Kth
Kth from the last element in a list using golang
我有代码可以在 golang 中从列表的最后一个元素中找到第 k 个元素。我写了一个递归函数。当它到达列表的末尾时,它将 return 计数为 1 并在进一步的 return 中递增。当 count == k 时 return 节点值。但是我收到 'nil pointer dereference' 错误。谁能帮我解决这个问题?
package main
import (
"container/list"
"fmt"
)
var sMap map[int]bool
func main() {
l := list.New()
for i := 1; i < 100; i++ {
l.PushBack(i)
}
kFromLastElemRec := findKFromLastRecr(l.Front(), 3, WrapObj{0})
fmt.Println(kFromLastElemRec.Value.(int))
}
//Object to store the count
type WrapObj struct {
count int
}
//ERROR
//recursive function to find the kth from last element
func findKFromLastRecr(head *list.Element, k int, wrapper WrapObj) *list.Element {
if head == nil {
return nil
}
resNode := findKFromLastRecr(head.Next(), k, wrapper)
wrapper.count = (wrapper.count) + 1
if wrapper.count == k {
return head
}
return resNode
}
您需要将指向 WrapObj
的指针传递给 findKFromLastRecr()
函数。
与C族语言类似,Go中的一切都是按值传递的。也就是说,一个函数总是得到一个被传递的东西的副本,就好像有一个赋值语句将值赋给参数。
例如,将 WrapObj
值传递给函数会复制 WrapObj
,但不会复制它指向的 WrapObj
。
因此,如果没有指向 WrapObj
的指针,每个 findKFromLastRecr()
函数都会得到一份 WrapObj
的副本,并且增加的部分不能由外部 findKFromLastRecr()
函数共享。
查看 golang-book 中的 pointers 部分可能会有用。
package main
import (
"container/list"
"fmt"
)
var sMap map[int]bool
func main() {
l := list.New()
for i := 1; i < 100; i++ {
l.PushBack(i)
}
kFromLastElemRec := findKFromLastRecr(l.Front(), 3, &WrapObj{0})
fmt.Println(kFromLastElemRec.Value.(int))
}
//Object to store the count
type WrapObj struct {
count int
}
//ERROR
//recursive function to find the kth from last element
func findKFromLastRecr(head *list.Element, k int, wrapper *WrapObj) *list.Element {
if head == nil {
return nil
}
resNode := findKFromLastRecr(head.Next(), k, wrapper)
wrapper.count = (wrapper.count) + 1
if wrapper.count == k {
return head
}
return resNode
}
输出
97
我有代码可以在 golang 中从列表的最后一个元素中找到第 k 个元素。我写了一个递归函数。当它到达列表的末尾时,它将 return 计数为 1 并在进一步的 return 中递增。当 count == k 时 return 节点值。但是我收到 'nil pointer dereference' 错误。谁能帮我解决这个问题?
package main
import (
"container/list"
"fmt"
)
var sMap map[int]bool
func main() {
l := list.New()
for i := 1; i < 100; i++ {
l.PushBack(i)
}
kFromLastElemRec := findKFromLastRecr(l.Front(), 3, WrapObj{0})
fmt.Println(kFromLastElemRec.Value.(int))
}
//Object to store the count
type WrapObj struct {
count int
}
//ERROR
//recursive function to find the kth from last element
func findKFromLastRecr(head *list.Element, k int, wrapper WrapObj) *list.Element {
if head == nil {
return nil
}
resNode := findKFromLastRecr(head.Next(), k, wrapper)
wrapper.count = (wrapper.count) + 1
if wrapper.count == k {
return head
}
return resNode
}
您需要将指向 WrapObj
的指针传递给 findKFromLastRecr()
函数。
与C族语言类似,Go中的一切都是按值传递的。也就是说,一个函数总是得到一个被传递的东西的副本,就好像有一个赋值语句将值赋给参数。
例如,将 WrapObj
值传递给函数会复制 WrapObj
,但不会复制它指向的 WrapObj
。
因此,如果没有指向 WrapObj
的指针,每个 findKFromLastRecr()
函数都会得到一份 WrapObj
的副本,并且增加的部分不能由外部 findKFromLastRecr()
函数共享。
查看 golang-book 中的 pointers 部分可能会有用。
package main
import (
"container/list"
"fmt"
)
var sMap map[int]bool
func main() {
l := list.New()
for i := 1; i < 100; i++ {
l.PushBack(i)
}
kFromLastElemRec := findKFromLastRecr(l.Front(), 3, &WrapObj{0})
fmt.Println(kFromLastElemRec.Value.(int))
}
//Object to store the count
type WrapObj struct {
count int
}
//ERROR
//recursive function to find the kth from last element
func findKFromLastRecr(head *list.Element, k int, wrapper *WrapObj) *list.Element {
if head == nil {
return nil
}
resNode := findKFromLastRecr(head.Next(), k, wrapper)
wrapper.count = (wrapper.count) + 1
if wrapper.count == k {
return head
}
return resNode
}
输出
97