如何更新 go 列表中的下一个指针?
How to update the next pointer in place in go list?
我有一个来自列表的节点指针。我想用列表中的下一个节点更新值和下一个指针。这只不过是就地删除,因为只能访问该指针。
例如 3 -> 5 -> 8 -> 9
要删除的节点:5(只能访问 5 个。假设前一个节点未知)
在这种情况下,节点[8]的值和下一个指针可以被复制到节点[5]。我有以下代码。它没有删除元素。如果我尝试使用 'next' 关键字访问下一个指针,则会抛出错误。
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
l.PushFront(4)
l.PushFront(5)
e4 := l.PushFront(7)
l.PushFront(6)
l.PushBack(9)
res := deleteNode(e4)
fmt.Println(res)
for e:=l.Front(); e!=nil;e=e.Next() {
fmt.Println(e.Value)
}
}
//ERROR
func deleteNode(node *list.Element) bool {
if node == nil || node.Next() == nil {
return false
}
var nextNode *list.Element
nextNode := node.next.(*list.Element)
node.Value = node.Next().Value.(int)
nextNode = nextNode.next.(*Element)
return true
}
谁能帮我解决这个问题?
您得到的(第一个)错误是:
no new variables on left side of :=
因为nextNode
已经存在。问题出在这两行:
var nextNode *list.Element
nextNode := node.next.(*list.Element)
在第一行中创建变量 nextNode
。在第二行中,您使用短赋值 :=
创建一个新变量(由左侧指定)并为其分配右侧的值。只需省略第一行,您只需要其中一个:
nextNode := node.Next()
此外,您无法读取或更改节点的 next
指针,因为 next
指针未在 Element
结构中导出(它以小写字母开头)。所以你试图实现的目标无法完成。但是您为此定义了一个函数:Remove(e *Element) interface{}
我有一个来自列表的节点指针。我想用列表中的下一个节点更新值和下一个指针。这只不过是就地删除,因为只能访问该指针。
例如 3 -> 5 -> 8 -> 9 要删除的节点:5(只能访问 5 个。假设前一个节点未知)
在这种情况下,节点[8]的值和下一个指针可以被复制到节点[5]。我有以下代码。它没有删除元素。如果我尝试使用 'next' 关键字访问下一个指针,则会抛出错误。
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.New()
l.PushFront(4)
l.PushFront(5)
e4 := l.PushFront(7)
l.PushFront(6)
l.PushBack(9)
res := deleteNode(e4)
fmt.Println(res)
for e:=l.Front(); e!=nil;e=e.Next() {
fmt.Println(e.Value)
}
}
//ERROR
func deleteNode(node *list.Element) bool {
if node == nil || node.Next() == nil {
return false
}
var nextNode *list.Element
nextNode := node.next.(*list.Element)
node.Value = node.Next().Value.(int)
nextNode = nextNode.next.(*Element)
return true
}
谁能帮我解决这个问题?
您得到的(第一个)错误是:
no new variables on left side of :=
因为nextNode
已经存在。问题出在这两行:
var nextNode *list.Element
nextNode := node.next.(*list.Element)
在第一行中创建变量 nextNode
。在第二行中,您使用短赋值 :=
创建一个新变量(由左侧指定)并为其分配右侧的值。只需省略第一行,您只需要其中一个:
nextNode := node.Next()
此外,您无法读取或更改节点的 next
指针,因为 next
指针未在 Element
结构中导出(它以小写字母开头)。所以你试图实现的目标无法完成。但是您为此定义了一个函数:Remove(e *Element) interface{}