我正在学习Go,并编写了以下代码来反向链接列表。但是,该代码无法按预期工作。
这是一个Node结构以及用于打印和反转列表的功能。
echo $((a + b))
问题在于,当我反转列表并调用type Node struct {
number int
previous *Node
next *Node
}
func PrintList(node *Node) {
for n := node; n != nil; n = n.next {
fmt.Println(n)
}
}
func ReverseList(node *Node) {
var nextNodeRef *Node
for n := node; n != nil; n = n.previous {
if n.next == nil {
n.next = n.previous
n.previous = nil
*node = *n
break
} else {
nextNodeRef = n.next
n.next = n.previous
n.previous = nextNodeRef
if n.next == nil {
node = n
}
}
}
}
时,除了最后一个元素(以前是第一个元素)外,列表中所有元素的输出似乎都是无限的
这是我的PrintList
函数:
main
这是我使用的func main() {
myList := Node{1, nil, nil}
myListAddress := &myList
AddNumber(2, myListAddress)
AddNumber(3, myListAddress)
fmt.Println("My list:")
PrintList(myListAddress)
ReverseList(myListAddress)
fmt.Println("My list reversed:")
// here I always get list elements that contain 3, 2, 3, 2...
PrintList(myListAddress)
}
函数:
AddNumber
答案 0 :(得分:1)
*node = *n
此行不执行您认为的操作。您可能希望更改外部*Node
指向新的头(旧的尾巴),是吗?好吧,不,它只是替换了该位置上的节点。这就解释了为什么缺少以前的第一个值。
所以在执行最后一步之前,您会遇到类似的情况
nil <- 3 <=> 2 <=> 1 -> nil
↑ ↑
n node, myListAddress
然后,将node
替换为n
(即nil <- 3 -> 2
)。这使结构看起来像这样:
prev
┌────────────────┐
│ │ node, myListAddress
˅ │╱
nil <- 3 <=> 2 -> 3 ──┐
^ │next
└────────┘
顺便说一句,此列表太小,以至于该图可能会误导您。包含更多元素的外观如下:
prev
┌────────────────────────────┐
│ │ node, myListAddress
˅ │╱
nil <- 5 <=> 4 <=> 3 <=> 2 -> 5 ──┐
^ │next
└────────────────────┘
您可以在那里使用**Node
。或者只是从函数中返回新的头部:
func ReverseList(node *Node) *Node {
for n := node; n != nil; n = n.previous {
if n.next == nil {
n.next = n.previous
n.previous = nil
return n
} else {
n.next, n.previous = n.previous, n.next
}
}
return node
}
然后
myListAddress = ReverseList(myListAddress)