给定指向节点的指针,删除该特定节点

时间:2011-10-31 09:54:58

标签: c++ linked-list

我有一个指向节点的指针,我想从链表中删除该特定节点。 以下逻辑工作正常,但如果要删除的节点是Last节点则失败。 如何删除最后一个节点?

void deleteNodWhosePointerIsGivene(node *pointerNode)
{
  node *temp=pointerNode->next;
  pointerNode->id=temp->id;
  pointerNode->next=temp->next;
  free(temp);
}

6 个答案:

答案 0 :(得分:1)

首先,您没有从列表中删除pointerNode,而是删除列表中的下一个节点。其次,您不会检查是否下一个节点。

答案 1 :(得分:0)

想想你想做什么。

您正尝试删除列表中的下一个对象。

您位于列表的末尾,因此临时指针将为空。

然后你试图从null获得下一个并尝试释放null。

通常我会做一些事情。

DeleteObject(*obj)
 Get Next Object
 Get Prev Object
 Set Prev->next = Next 
 Set Next->prev = Prev
 Delete obj;

如果我理解你上面的评论,你想要复制一下,那么你的代码应该是这样的。

 DeleteObject
 Get Next Object
 if (Next Object is not null)
    This.Id == Next.Id
    Free Next
 else 
    Throw exception "Cannot delete last object in list"

如果要删除列表中的最后一个对象,则无法在列表中的倒数第二个对象中设置指针。执行此操作的唯一方法是使用双链表,或者向下搜索列表以查找要删除的指针,并跟踪列表中的最后一个对象。

答案 2 :(得分:0)

您没有删除代码中的pointerNode,您正在删除pointerNode-> next。

查看单个链表的示例。假设我们有:

1→2→3→4-→5

传入一个指针节点“3”。然后,您的代码将执行以下操作:

1)指定pointerNode->紧邻temp,即“4”

2)pointerNode->接下来将分配temp-> Next,即“5”

3)释放临时温度,即“4”

所以在此之后您的列表将是1-> 2-> 3-> 5.

当您到达节点“5”时,您将收到访问冲突

1)pointerNode-> next被分配给temp,即NULL

2)pointerNode->接下来将分配temp-> Next,即引用NULL指针时的访问冲突。

双向链表是一个更好的解决方案,删除pointerNode需要更改前一个节点的Next指针。否则,您必须首先扫描列表以找到pointerNode之前的节点。

答案 3 :(得分:0)

这是适用于单个链接列表的代码。请记住,对于大型列表来说,这将是非常缓慢的,我会提出安德鲁·诺曼的建议,即使用双向链表。

无论如何..这里去了。为了使其工作,您需要传递列表的根节点,并注意如果您尝试删除它,可能会更改此节点的地址,因此我将其作为指针传递给指针。

void DeleteNode (Node **rootNode,Node *pointerNode)
{
    Node *prevNode;

    if (pointerNode == *rootNode) {

       // Head node is being removed

       *rootNode = pointerNode->Next;

    } else {

       // Find the previous node

       for (prevNode = *rootNode; prevNode->Next != pointerNode;
            prevNode = prevNode->Next) ;

       prevNode->Next = pointerNode->Next;
    }

    // Free the node

    free (pointerNode);
}

答案 4 :(得分:0)

如果你真的需要删除与你的指针所在节点相关联的项目,那么当涉及到最后一个节点时,你有两个选择:

  • 从列表的开头迭代以找到它的前任(倒数第二个节点),删除最后一个节点并将其前任的next设置为NULL。

  • 采用惰性方法 - 实际上不删除节点并仅将其标记为死(例如,通过将其数据设置为不可能的值。)以后从前一个到达时删除它(然后也是NULL-前任的next)。

这两种方法都有明显的缺点。这就是为什么在从链表中删除节点时最好始终使用前一个。

答案 5 :(得分:0)

如果您能够引用上一个节点。

void deleteNodWhosePointerIsGivene(structNode* pCurrentNode, structNode* pPreviousNode)
{
    // Not the Last Node ?
    if(pCurrentNode->pNext) 
        pPreviousNode->pNext = pCurrentNode->pNext);                    
    else
        pPreviousNode->pNext = NULL;

    delete pCurrentNode;
    pCurrentNode = NULL;
}

否则,您需要引用列表的第一个节点,并搜索上一个节点。