[英]Deleting node in linked list - segmentation fault
问题需要给定链表的头指针和要删除的链表中节点的位置,从链表中删除节点。 有关问题的更多详细信息,请访问: https : //practice.geeksforgeeks.org/problems/delete-a-node-in-single-linked-list/1
代码返回分段错误,但不确定我哪里出错了。 我的代码如下:
Node* deleteNode(Node *head,int x)
{
//Your code here
struct Node* temp = head;
if(x==0){
//change head
head = temp->next;
free(temp);
}
//find previous node of node to be deleted
for(int i=0; temp!=NULL && i<x-1; ++i){
//traverse
temp = temp->next;
}
//now temp should be pointing to previous node
//store pointer to next of node to be deleted
struct Node* next = temp->next->next;
free(temp->next);
temp->next= next;
}
您应该在开始时以及在执行最后 3 行代码之前检查head == nullptr
if temp == nullptr
因为您可以退出 for 循环,因为用户试图删除的节点超出了大小.
您还应该考虑从您的函数中返回void
。
你可以这样做:
void deleteNode(Node *head,int x)
{
// this way you avoid dereferencing nullptr with temp->next later on
if(head == nullptr) return;
//Your code here
struct Node* temp = head;
if(x==0){
//change head
head = temp->next;
free(temp);
}
//find previous node of node to be deleted
for(int i=0; temp!=NULL && i<x-1; ++i){
//traverse
temp = temp->next;
}
//now temp should be pointing to previous node
//store pointer to next of node to be deleted
// you need to check to see if temp is nullptr here or if the node
// after temp is nullptr because either of those can cause you to
// get a segmentation fault because of dereferencing a nullptr
if(temp == nullptr || temp->next == nullptr) return;
struct Node* next = temp->next->next;
free(temp->next);
temp->next= next;
}
您的代码包含许多可以取消引用空指针的地方。 例如这里:
struct Node* temp = head;
if(x==0){
//change head
head = temp->next;
free(temp);
}
如果head
已经是空指针。 此外,您似乎假设这会更改caller 中的head
变量,但事实并非如此。 你必须通过一个双指针来实现这一点。 最后,看起来你的函数应该在free(temp);
之后返回free(temp);
.
然后,看这部分:
for(int i=0; temp!=NULL && i<x-1; ++i){
//traverse
temp = temp->next;
}
//now temp should be pointing to previous node
//store pointer to next of node to be deleted
不,它不一定指向一个节点, temp
也可以包含一个空指针,这是 for 循环的第二个中断条件。 如果是这种情况,您必须检查并退出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.