【问题标题】:Given a pointer of node to be deleted in a linked list . how will you pass a pointer to the node in main function?给定链表中要删除的节点指针。你将如何在主函数中传递一个指向节点的指针?
【发布时间】:2015-07-24 10:13:38
【问题描述】:

假设我有一个列表 [10 20 30 40 50 60] 我想删除一个数据值为40的节点,如何从main()函数传递这个节点的指针?

我知道如果我想删除 10,我可以简单地传递 head,如果我想删除第二个节点,那么我可以传递 head->next,但是如果列表很大并且假设我想删除第 70 个节点怎么办?

【问题讨论】:

  • 遍历是到达所需节点的唯一选项。
  • ^^ 如果您需要通过数据值更快地找到节点,您应该放弃 ll 作为容器 - 使用排序列表、树或地图。

标签: c linked-list


【解决方案1】:

一般来说,不管多长,你都要走近路,

  • 开始遍历链表节点,从头部开始,一个一个。
  • 到达特定节点,检查数据值。

    • 如果匹配,则更新指向下一个(前一个)节点的指针。
    • 如果不匹配,则移动到下一个节点。
  • 继续直到到达叶节点。

关于传递节点,您可以简单地将指针传递给要释放的节点,并从删除函数中释放内存。在调用删除函数之前,您需要进行所需的更改以重新对齐列表,而不是要删除的节点。

编写代码,如果您遇到任何问题,我们很乐意提供帮助。

【讨论】:

  • 我知道我们必须遍历列表才能删除要删除的叶子,但是当您传递节点的数据值时就是这种情况。但我问的是什么时候不给出数据值,只给出节点的指针。
  • @Chauhan 如果你有节点计数然后循环到那个计数 temp = temp->next;其中 temp 在循环之前被分配为 head 并删除 temp
  • @Chauhan 如果您知道迭代次数,请将其用作循环中的标记,而不是比较值以获取该节点。
【解决方案2】:

如果是单链表,你必须在删除的指针之前传递一个指针。

例如 C++ 中的标准单链表std::forward_list 有以下删除节点的方法

iterator erase_after(const_iterator position);
iterator erase_after(const_iterator position, const_iterator last);

问题是您必须更新已删除节点之前的节点。如果列表是单链表,则节点只有到下一个节点的链接。它们与前面的节点没有链接。

否则你必须在遍历整个列表的函数中找到要删除的传递指针。

和没有区别

如果我想删除第二个节点,那么我可以通过 head->next,

如果列表很大,假设我想删除第 70 个节点

因为函数不知道它确实是第2个节点还是第70个节点。:)

但是,如果您在搜索操作后跟踪列表中的位置,则可以让您的生活更轻松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多