【问题标题】:Deleting the nth node in a linked list, can't delete first node?删除链表中的第n个节点,不能删除第一个节点?
【发布时间】:2013-06-27 22:57:57
【问题描述】:

下面是一个用于删除链表中第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 个节点 列表中发生的情况示例,其中包含整数值 23242526 顺序(在 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

(比段错误更多的垃圾数字)

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

【问题讨论】:

  • head = deleteN(head, 1);
  • ^这也是正确的,谢谢。

标签: c recursion linked-list nodes


【解决方案1】:

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

这应该可行:

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

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

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

【讨论】:

  • 你的预感是对的,我应该更多地关注 main 而不是假设问题出在 deleteN 函数上!
  • @KarimElsheikh 我很高兴 AMADANON 能够提供帮助。如果您同意他们的回答是正确的,请接受。谢谢!
  • @Riley OP 已经接受了我的回答,可能是因为我发布得早一点,所以 OP 先看到了。
  • 我们同时打字,Jim 先提交。就这样吧,下一个我会得到声望的。
【解决方案2】:

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

head = deleteN(head, n);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    相关资源
    最近更新 更多