在我提交我的代码之前,我想知道我的想法是否正确,因为我已经确认了#34;正确的"回答这个问题。
是否可以通过找到给定节点的位置,然后在给定位置使用常规“删除”来解决此问题。功能?所以基本上前一个节点将指向给定节点的下一个节点。即,如果s被给定节点,则ptr是前一节点,然后是ptr-> next = s-> next。这是对的吗?
答案 0 :(得分:2)
你是对的。
让我们说要删除的节点是 delNode 。
您建议的解决方案包含两部分:
时间复杂度为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.
之前:头 - > ... - > A - > delNode - > B - > C - > ...
之后:头 - > ... - > A - > delNode(== B状态包括B.next == C) - > C - > ...
所以被删除的节点实际上是 B 和B
快速摘要:
<强>优点:强>
<强>缺点:强>
解决方案不适用的案例:
最后的事
C ++实施 - 不要忘记 删除(B) 。