C++ If语句正在工作,但在If语句内部返回。我做错了什么?
我正在研究HackerRank的问题“比较两个链表”。我比较两个链表的功能如下: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;
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);
}