我有一个指向节点的指针,我想从链表中删除该特定节点。 以下逻辑工作正常,但如果要删除的节点是Last节点则失败。 如何删除最后一个节点?
void deleteNodWhosePointerIsGivene(node *pointerNode)
{
node *temp=pointerNode->next;
pointerNode->id=temp->id;
pointerNode->next=temp->next;
free(temp);
}
答案 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;
}
否则,您需要引用列表的第一个节点,并搜索上一个节点。