尝试递归搜索时,我没有返回正确的数字。我使用它来遍历用单链表实现的队列并返回该项所在的索引,这样我就可以确定我需要多少次dequeue()来获取该项。
public int search(E item) {
return recSearch(item, head);
}
public int recSearch(E item, Node node){
if (head == null){
return -1;
}else if (node.data.equals(item)){
return searchCnt;
}else{
searchCnt++;
return recSearch(item, node.next);
}
}
我觉得它应该正确计数,因为它必须在每次无法满足if和else if条件时计算,但我不是在正确的位置递增?或者我完全离开了?谢谢你的帮助!
答案 0 :(得分:2)
在调用searchCnt
之前,您需要在search()
内将recSearch()
设置为0。此外,您还需要测试node == null
,而不是head == null
。
或者,您可以尝试这样做:
public int search(E item) {
return recSearch(item, head, 0);
}
public int recSearch(E item, Node node, int index){
if (node == null){
return -1;
}else if (node.data.equals(item)){
return index;
}else{
return recSearch(item, node.next, index + 1);
}
}
它消除了对类/实例变量的需要。
请注意,这不允许节点上的null
数据。要支持null
值,在检查if/else
后,您需要另一个node == null
分支:
}else if (item == null && node.data == null) {
return index;
}
答案 1 :(得分:1)
您希望在递归时传递searchCnt
var,以便正确更新。
public int search(E item) {
return recSearch(item, head, 1);
}
public int recSearch(E item, Node node, int searchCnt){
if (head == null){
return -1;
}else if (node.data.equals(item)){
return searchCnt;
}else{
return recSearch(item, node.next, ++searchCnt);
}
}
初始调用中的1
假设,如果您在recSearch
的第一次迭代中找到了您的项目,则该项目将被视为一次搜索(而search
将返回1
在那种情况下)。