我正在编写一个递归函数来查找链表中节点的索引。它看起来像这样:
function indexAt(node, collection, linkedList) {
let index = 0;
if (node === nodeAt(index, linkedList,collection)) {
return index
} else {
index ++
return indexAt(node, collection, linkedList)
}
}
它调用nodeAt函数,如下所示:
function nodeAt(index, linkedList, collection) {
let node = collection[linkedList];
for (let i=0; i < index; i++) {
node = next(node, collection)
}
return node
}
当索引为0时,这可以正常工作,但是当它是其他任何东西时,它会递增索引,然后将其设置回0,进入无限循环。如何在不从根本上改变代码的情况下解决这个问题?
答案 0 :(得分:0)
在函数开始时,您将索引重置为0.因此,每次重复时,它都会重置索引,从而导致无限循环。
一个简单的解决方法是在函数外声明索引变量。这将确保每次函数重复时都不会重置。
更好的解决方法是将索引作为参数传递给函数,以便它始终跟踪自己的索引。
答案 1 :(得分:0)
只需制作一个包含额外变量的助手:
function indexAt(node, collection, linkedList) {
function indexAt(index, node, collection, linkedList) {
if (node === nodeAt(index, linkedList, collection)) {
return index
} else {
return indexAt(index + 1, node, collection, linkedList)
}
}
return indexAt(0, node, collection, linkedList);
}
现在你从0 ... n开始计数,并在每次创建这个O(n ^ 2)时使nodeAt
从头开始。一个更好的方法是帮助器具有当前节点,在collection[linkedList]
初始化,并以next(currentNode)
和index + 1
步进,直到node === currentNode
。这将是一个O(n)解决方案。 indexAt
除非是必需的,否则不需要递归。