我正在扭转双重链表。我的功能是:
Node* Reverse(Node* head)
{
// Complete this function
// Do not write the main method.
Node* temp = new Node();
if ( head == NULL) { return head; }
while ( head != NULL) {
temp = head->next;
head->next = head->prev;
head->prev = temp;
if (temp == NULL ) { break; }
head = temp;
}
return head;
}
这可以正常工作。 而不是使用break命令,如果我'返回head'而不是函数退出while循环并且有编译错误:控制到达非void函数的结尾[-Werror = return-type]
Node* Reverse(Node* head)
{
// Complete this function
// Do not write the main method.
Node* temp = new Node();
if ( head == NULL) { return head; }
while ( head != NULL) {
temp = head->next;
head->next = head->prev;
head->prev = temp;
if (temp == NULL ) { return head; }
head = temp;
}
}
这背后的原因是什么?
答案 0 :(得分:4)
原因是编译器不知道temp
总是在某个时刻最终成为NULL
,它只知道循环可以结束,并且函数将没有return语句。
正如 CompuChip 指出的那样,您可以在最后添加以下行,以安抚编译器:
throw std::runtime_error("Control should never reach this point");
或者您最后可以返回NULL
。
答案 1 :(得分:1)
你所知道的,但编译器不知道,条件temp == NULL
在head != NULL
变为假之前是真的。它假定while
循环可能自然结束(使用head == NULL
),因此缺少return语句。
将while
循环条件更改为1
(true)可能会解决警告问题。 (毕竟这是一个警告,并不是真正的错误;因为你要求它使用-Werror
),它会变成错误。
更好的做法是尽可能避免改变控制流量(尽可能避免break
)。这使代码更容易理解其他人和编译器:
Node* Reverse(Node* head)
{
if (head == NULL) { return head; }
Node* temp = head->next;
while (temp != NULL) {
head->next = head->prev;
head->prev = temp;
head = temp;
temp = head->next;
}
return head;
}