删除仅给定节点的单链表中间的节点。 C ++

时间:2015-04-04 15:48:03

标签: c++ linked-list

在我提交我的代码之前,我想知道我的想法是否正确,因为我已经确认了#34;正确的"回答这个问题。

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

1 个答案:

答案 0 :(得分:2)

你是对的。

让我们说要删除的节点是 delNode

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

  1. 在列表中搜索<​​em>索引。
  2. 然后在[索引]处删除节点。
  3. 时间复杂度为O(n) - 其中n是列表的大小。 (第1部分最坏的情况是O(n))。 这个解决方案没有问题。 如果找不到Node 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.

    之前:头 - &gt; ... - &gt; A - &gt; delNode - &gt; B - &gt; C - &gt; ...

    之后:头 - &gt; ... - &gt; A - &gt; delNode(== B状态包括B.next == C) - &gt; C - &gt; ...

    所以被删除的节点实际上是 B 和B

    快速摘要:

    <强>优点:

    • 时间复杂度为O(1)。

    <强>缺点:

    解决方案不适用的案例:

    • delNode.next == Null
    • 多态列表。 对于具有多态类型的列表存在问题。例如: Car Bus 都具有相同的SuperClass Vehicle ,并且列表包含 Vehicle 对象。 如果delNode是Car,B是Bus,那么复制B状态到delNode的想法是错误!这些对象具有不同的具体类型,因此该解决方案不适用于这种情况。

    最后的事

    C ++实施 - 不要忘记 删除(B)