C++ If语句正在工作,但在If语句内部返回。我做错了什么?

C++ If语句正在工作,但在If语句内部返回。我做错了什么?,c++,linked-list,C++,Linked List,我正在研究HackerRank的问题“比较两个链表”。我比较两个链表的功能如下: bool compare_lists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) { if(head1 != nullptr && head2 != nullptr){ if(head1->data != head2->data){ return 0;

我正在研究HackerRank的问题“比较两个链表”。我比较两个链表的功能如下:

bool compare_lists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    if(head1 != nullptr && head2 != nullptr){
        if(head1->data != head2->data){
            return 0;
        }
        compare_lists(head1->next, head2->next);
    }
    else if(head1 != head2){
        cout << head1 << endl << head2 << endl;
        return 0;
    }
    return 1;
}
bool比较\u列表(SinglyLinkedListNode*head1,SinglyLinkedListNode*head2){
if(head1!=nullptr&&head2!=nullptr){
if(head1->data!=head2->data){
返回0;
}
比较_列表(head1->next,head2->next);
}
否则如果(头1!=头2){

cout您没有返回对
比较列表的递归调用

bool compare_lists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    if(head1 != nullptr && head2 != nullptr){
        if(head1->data != head2->data){
            return 0;
        }
        return compare_lists(head1->next, head2->next); // return was missing here
    }
    else if(head1 != head2){
        cout << head1 << endl << head2 << endl;
        return 0;
    }
    return 1;
}
bool比较\u列表(SinglyLinkedListNode*head1,SinglyLinkedListNode*head2){
if(head1!=nullptr&&head2!=nullptr){
if(head1->data!=head2->data){
返回0;
}
return compare_list(head1->next,head2->next);//此处缺少return
}
否则如果(头1!=头2){

试着回答这个问题:当
head1==head2
(1)和
head1->data==head2->data
(2)并且它们都不是
nullptr
(3)时,该方法返回什么

这个方法返回什么

1
。始终!(给定的(1)、(2)和(3)都是
真的

如何修复它

您正在忽略递归调用的返回值。请不要这样做

PS也许有助于考虑修改版本中发生的事情(仅是简化的示例,但您可以在实际代码中应用相同的修改):

一旦您了解了可以为该其他函数添加定义:

bool some_other_function(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    return compare_lists(head1,head2);
}

您对
compare\u list
进行递归调用,但随后忽略其返回值并无条件地返回1
。递归调用没有任何效果。它应该仅在到达代码中的该点时返回1,即,如果它的长度相同,并且在所有点上具有相同的值。我可能对此有错误,但为什么会这样做当对应的值不同时,它成功地返回0?@igortandtnik思考第一个顶级的
compare\u list
调用在做什么。假设两个节点都不是空的,并且具有相同的数据。然后它递归调用
compare\u list
,但是那里没有
return
语句,因此执行过程返回到最后一个
return 1
语句。啊,所以我认为返回0会破坏递归并将0返回到main。这不是真的吗?因为如果两个节点都不是nullptr并且它们的值不相同,那么我们将到达最后一个节点,其中一个是nullptr,另一个不是,应该返回0,或者e该值不相同,它将返回0,或者它将一直返回1,这意味着列表是相同的。这就是我认为它将如何工作@igortandtnik当
main
调用某个函数时,您不希望该函数中的
return
也从
main
返回并终止程序,是吗?类似地,当
compare\u list
递归调用
compare\u list
时,第二次调用中的
return
不会神奇地终止第一次调用-它只返回一个值,第一次调用可以以某种方式使用该值(例如,反过来将该值返回给调用方).但实际上你没有以任何方式使用返回值。我真的不知道这意味着什么。如何返回函数?函数返回布尔值。这不返回函数-它调用函数并返回函数调用的结果。好的,我会尝试一下,稍后再考虑。谢谢!好的,我想我遗漏了一些关于C++中返回的方式非常基本。我相信我现在明白了,但是我需要更多地考虑它。非常感谢。”安德鲁弗利诺。这是递归的一个非常常见的错误。我很想知道误解是什么引起的,但是我恐怕要花更长的时间才能找到答案。.别担心,最好做与“我会试试这个,以后再考虑”相反的事情。请确保现在就理解;)好的!我正在查看其他有关此问题的堆栈溢出帖子,试图确切理解为什么此函数需要返回递归调用才能工作。但至少我知道我在寻找什么。再次感谢!@idclev463035818@AndrewLubrino我加了一个PS。问题是这个错误是实际的这与递归本身没有多大关系(但由于某些原因,它经常出现在递归中)因此,我最初的理解是,当调用return时,它会立即退出函数并将值返回main。如果这是真的,我的原始代码可能会正常工作?因为如果函数在代码中的较早点返回0,当检查相似性的If语句之一出现时,它将永远不会返回1被绊倒。但我现在猜测return只返回递归中的“previous”函数。我仍然感到困惑,因为该函数在7个测试用例中的5个用例中工作,并且在某些情况下成功返回了0。@idclev 463035818
bool compare_lists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    compare_lists(head1->next, head2->next);
    return 1;
}
bool some_other_function(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2);

bool compare_lists(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    some_other_function(head1->next, head2->next);
    return 1;
}
bool some_other_function(SinglyLinkedListNode* head1, SinglyLinkedListNode* head2) {
    return compare_lists(head1,head2);
}