所以下面的代码:
/*
* For your reference:
*
* SinglyLinkedListNode {
* int data;
* SinglyLinkedListNode* next;
* };
*
*/
SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
SinglyLinkedListNode* temp = head;
while (temp != NULL) {
temp = temp->next;
}
SinglyLinkedListNode* temp1;
temp1->data = data;
temp1->next = NULL;
temp->next = temp1;
return temp;
}
因此,基本上,我想在链接列表“ head”的末尾添加“ data”并返回更新后的列表。那哪里出了问题?
编辑:好的,我遇到了第一个错误。但是,即使我在循环条件中将temp!= NULL替换为temp-> next!= NULL仍然存在此错误
您必须为节点分配内存。记住要清理分配的内存。对于每次呼叫new
,您都需要一个呼叫delete
。因此,我更喜欢智能指针。
循环后,temp
包含NULL
。您不能取消引用空指针。
SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
if (!head) {
head = new SinglyLinkedListNode;
head->next = nullptr;
head->data = data;
return head;
}
SinglyLinkedListNode* temp=head;
while(temp->next){
temp = temp->next;
}
SinglyLinkedListNode* temp1 = new SinglyLinkedListNode;
temp1->data = data;
temp1->next = nullptr;
temp->next = temp1;
return temp;
}
它也在这里崩溃:
SinglyLinkedListNode* temp1;
temp1->data=data;
到达循环while(temp!=NULL){
的末尾时,此处temp
为NULL
。下面您正在使用类似temp->next=temp1;
的语句,这会导致崩溃
此功能
SinglyLinkedListNode* insertNodeAtTail(SinglyLinkedListNode* head, int data) {
SinglyLinkedListNode* temp=head;
while(temp!=NULL){
temp=temp->next;
}
SinglyLinkedListNode* temp1;
temp1->data=data;
temp1->next=NULL;
temp->next=temp1;
return temp;
}
没有道理。在此循环之后
while(temp!=NULL){
temp=temp->next;
}
指针temp
等于NULL。所以这条语句
temp->next=temp1;
调用未定义的行为。
指针temp1
未初始化。再次这些声明
temp1->data=data;
temp1->next=NULL;
调用未定义的行为。
函数的用户不知道返回的指针是列表的开头还是最后一个指针。因此,不清楚是将返回的指针分配给头指针还是只是忽略返回的值。
该函数可以通过以下方式查看。
void insertNodeAtTail( SinglyLinkedListNode * &head, int data )
{
SinglyLinkedListNode **current = &head;
while ( *current != nullptr ) current = &( *current )->next;
*current = new SinglyLinkedListNode { data, nullptr };
}
该函数的另一种定义可以如下所示
SinglyLinkedListNode* insertNodeAtTail( SinglyLinkedListNode *head, int data )
{
SinglyLinkedListNode *new_node = new SinglyLinkedListNode { data, nullptr };
if ( head == nullptr )
{
head = new_node;
}
else
{
SinglyLinkedListNode *current = head;
while ( current->next != nullptr ) current = current->next;
current->next = new_node;
}
return head;
}