下面是一个函数,旨在删除链表中的第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 %dn", temp->data);
head = temp->next;
free(temp);
return head;
}
head->next = deleteN(head->next, n-1);
return head;
}
它工作正常,除非您调用例如 deleteN(head, 1)
,它应该删除列表中的第一个节点,但是当我调用另一个函数来打印列表时,它会打印随机地址。
包含整数值 23、24、25 和 26 的 4 个节点列表中发生的情况示例(在 main then output 中称为(:
测试用例 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
(更多的垃圾数字然后段错误(
我的问题是我如何修改我的代码,以便它也可以删除第一个节点?
从您的问题中不清楚,但我怀疑您在调用 deleteN(( 时没有更新 head。
这应该有效:
head=deleteN(head,1);
printList(head);
我认为这就是您正在做的事情:
deleteN(head,1);
printList(head);
你从 deleteN 返回一个值,但你不使用它。您需要更新head
head = deleteN(head, n);