1

下面是一个旨在删除链表中第 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;

}

它工作正常,除非你调用 eg deleteN(head, 1),它应该删除列表中的第一个节点,但是当我调用另一个函数来打印列表时,它会打印随机地址。

在包含整数值23242526的4 个节点的列表中发生的事情的示例(在 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

(更多的垃圾号码然后是段错误)

我的问题是如何修改我的代码以便它也可以删除第一个节点?

4

2 回答 2

2

您的问题尚不清楚,但我怀疑您在调用 deleteN() 时没有更新头部。

这应该有效:

head=deleteN(head,1);
printList(head);

我认为这就是你正在做的事情:

deleteN(head,1);
printList(head);
于 2013-06-27T23:02:22.890 回答
1

您从 deleteN 返回一个值,但您不使用它。你需要head更新

head = deleteN(head, n);
于 2013-06-27T23:01:41.150 回答