删除链表中的第n个节点,是否无法删除第一个节点?

时间:2013-06-27 22:57:58

标签: c recursion linked-list nodes

下面是一个用于删除链表中第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

(更多垃圾数字然后是段错误)

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

2 个答案:

答案 0 :(得分:2)

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

这应该有效:

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

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

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

答案 1 :(得分:1)

您从deleteN返回一个值但不使用它。您需要使用

更新head
head = deleteN(head, n);