以下代码出错,我不知道为什么。 以下功能是将节点插入链表的末尾。
struct Node {
int data;
struct Node *next;
};
Node* Insert(struct Node *head,int data)
{
struct Node *p;
p=head;
struct Node *prev;
struct Node *temp=(struct Node*)malloc(sizeof(struct Node));
temp->data=data;
temp->next=NULL;
if(head==NULL){
head=temp;
return head;
//return temp;
} ``
while(p!=NULL){
prev=p;
p=p->next;
}
p=temp;//If we change this line to prev->next=temp .It is giving the correct result
return head;
}
在上面的代码中
如果我们将行(p=temp;)
替换为prev->next=temp
则可行。
请帮助我理解这背后的逻辑。
提前致谢。
问题来自hackrank。
答案 0 :(得分:0)
您将新创建的节点分配给p。该部分是正确的。但是,前一个节点不知道这个新创建的最后一个元素的地址,因为prev->next
被赋值为NULL。因此,您必须将前一个下一个指针指向temp,以便节点temp链接到List.Just在while循环结束之前,p有一些值,但下一个指针被赋值为NULL。所以下次prev有一些数据,下一个指针是NULL。您没有将此下一个指针更改为指向下一个临时节点。仅将临时值分配给p。因此,最后一个临时值未链接到列表。
循环后尝试:
p=temp;
prev->next=p;
或者只是
prev->next=temp;