*SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
SinglyLinkedListNode *t=new SinglyLinkedListNode(data);
SinglyLinkedListNode *last{head};
if(head==nullptr)
{
head=t;
return head;
}
else if(last->next==nullptr)
{
last->next=t;
last=t;
return head;
}
else
{
while(last)
{
if(last->next==nullptr)
{
last->next=t;
last=t;
return head;
}
last=last->next;
}
}
}
此函数将节点添加到链接列表的末尾。如果我在If-else块之外写一个返回语句,工作正常,但如上所述,它给出了一个错误。为什么?
消息说至少有一个代码路径缺少return
-检查您的最后一个else
。如果因为last==nullptr
而存在while
,则不存在return
。
while(last)
理论上可以退出。如果你不小心从不同的线程重新输入了这个函数,它甚至可能是正确的。
可以重新排列代码以简化流程。函数的目的是必须遍历next的值,如果next是nullptr,则必须替换它。你确定你总是要退回head
吗?这看起来像是一个错误\ bug。
{
SinglyLinkedListNode *t =new SinglyLinkedListNode(data);
if(!head)
return head = t;
SinglyLinkedListNode *last{head};
while (last->next)
last = last->next;
// we go here if last->next is nullptr,
// earliest case would be head->next == nullptr
return (last->next = t);
}
不管怎样,这个函数都会在任何路径上返回一些东西。
PS:我真的希望构造函数看起来像SinglyLinkedListNode(Data &d) : data(d), next(nullptr) {}
,或者你手上有UB和可能的无限循环