下面是一个用于删除链表中第n个节点的函数。例如,如果我调用deleteN(head, 2)
,它将删除列表中的第二个节点。
node *deleteN(node *head, int n)
{
if (head == NULL)
return NULL;
if (n == 1)
{
node *temp = head;
//printf("the element is %d\n", temp->data);
head = temp->next;
free(temp);
return head;
}
head->next = deleteN(head->next, n-1);
return head;
}
除非你打电话,否则它可以正常工作deleteN(head, 1)
,它应该删除列表中的第一个节点,但当我调用另一个函数来打印列表时,它会打印随机地址。
4个节点列表中包含整数值 23 , 24 , 25 , 26 按顺序(在main然后输出中调用):
测试案例1(通过):
deleteN(head, 2);
printList(head);
输出:
23
25
26
测试案例2(通过):
deleteN(head, 3);
printList(head);
输出:
23
24
26
测试案例3(通过):
deleteN(head, 4);
printList(head);
输出:
23
24
25
测试案例4(失败):
deleteN(head, 1);
printList(head);
输出:
34223223
34234242
34342343
34343434
34234434
(更多垃圾数字然后是段错误)
我的问题是如何修改我的代码以便它也可以删除第一个节点?
答案 0 :(得分:2)
您的问题并不清楚,但我怀疑您在调用deleteN()时没有更新头部。
这应该有效:
head=deleteN(head,1);
printList(head);
我认为这就是你在做的事情:
deleteN(head,1);
printList(head);
答案 1 :(得分:1)
您从deleteN返回一个值但不使用它。您需要使用
更新head
head = deleteN(head, n);