Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 删除只在节点上的单链表中间的一个节点。C++;_C++_Linked List - Fatal编程技术网

C++ 删除只在节点上的单链表中间的一个节点。C++;

C++ 删除只在节点上的单链表中间的一个节点。C++;,c++,linked-list,C++,Linked List,在这里提交代码之前,我想知道我的想法是否正确,因为我已经找到了这个问题的“正确”答案 是否可以通过查找给定节点的位置,然后使用常规的“在给定位置删除”功能来解决此问题?因此,基本上,前一个节点将指向给定节点的下一个节点。i、 e,如果s是给定的节点,则ptr是上一个节点,然后ptr->next=s->next。这是对的吗?你说得对 假设要删除的节点是delNode 您建议的解决方案分为两部分: 在列表中搜索其索引 然后删除[索引]处的节点 时间复杂度是O(n)-其中n是列表的大小。(第1部分最坏

在这里提交代码之前,我想知道我的想法是否正确,因为我已经找到了这个问题的“正确”答案

是否可以通过查找给定节点的位置,然后使用常规的“在给定位置删除”功能来解决此问题?因此,基本上,前一个节点将指向给定节点的下一个节点。i、 e,如果s是给定的节点,则ptr是上一个节点,然后ptr->next=s->next。这是对的吗?

你说得对

假设要删除的节点是delNode

您建议的解决方案分为两部分:

  • 在列表中搜索其索引
  • 然后删除[索引]处的节点
  • 时间复杂度是O(n)-其中n是列表的大小。(第1部分最坏情况为O(n))。 这个解决方案没有问题。 如果未找到节点delNode,则不会进行删除

    另一种解决方案:(及其优缺点)

    假设delNode前后的节点分别为A和B。 A有其A.data和A.next,而delNode有其delNode.data和delNode.next(即:delNode.next==B)。 删除delNode意味着在删除它之后,A.next==B

    但是如果不使用搜索,我们无法更改a.next,因为a无法从delNode(单链表)访问

    因此,我们可以尝试如下操作列表,而不是搜索delNode: delNode.data=delNode.next.data(Simplier:delNode=B.data)。 delNode.next=delNode.next.next(delNode.next=B.next)

    这些更改将delNode对象保留在内存中,但其状态已更改,并且B的所有内容都复制到delNode。现在的delNode实际上是B,因为B.next(=C)也被复制到了delNode.next,delNode之后的下一个节点是C

    前:Head-->…-->A-->delNode-->B-->C-->

    之后:Head-->…-->-->delNode(=B状态包括B.next==C-->C-->

    因此,被删除的节点实际上是B和B

    快速摘要:

    优点:

    • 时间复杂度为O(1)
    缺点:

    解决方案不适用的情况:

    • delNode.next==Null
    • 多态列表。 对于具有多态类型的列表,存在一个问题。例如:CarBus都具有相同的超类Vehicle,并且列表包含Vehicle对象。 如果delNode是一辆汽车,B是一辆公共汽车,那么将B状态复制到delNode的想法是错误的!这些对象具有不同的具体类型,因此此解决方案不适用于这种情况
    最后一件事


    C++实现-别忘了删除(B)

    是的,这是正确的,通常是这样做的为什么不画框,用线表示链接,看看你在纸上是怎么做的?“在我在这里提交代码之前,我想知道…”。。。。这可能是你可以在聊天室里问的问题。您的代码或概念是否有特殊问题?如何找到给定节点的前一个节点?