我尝试在双链表中编写删除节点的功能。 但我堆叠在第一个条件,其中nodeToDelete也是头。 当我使用该代码免费(nodeToDelete)不要释放nodeToDeleteBut nodeToDelete-> nextNode;
任何帮助?
编辑:删除也不工作看截图 - > https://s22.postimg.org/dff43kn9d/slide.jpg
编辑
void deleteNode(node *&head, int value)
修复我的代码,谢谢。
void deleteNode(node *head, int value)
{
node* nodeToDelete = head;
while(nodeToDelete != NULL)
{
if(nodeToDelete->value == value)
{
if(nodeToDelete == head)
{
head = nodeToDelete->nextNode;
head->previousNode = NULL;
delete nodeToDelete;
return;
}
}
nodeToDelete = nodeToDelete->nextNode;
}
}
答案 0 :(得分:2)
您的步骤顺序错误。我画了一个带有节点和指针的快速草图,这是我发现的:
首先从两个指针开始:head和nodeToDelete,它们都指向要删除的节点。然后指向下一个节点并将其指针置为前一节点并继续删除nodeToDelete。 到目前为止没问题。
但是这一行:nodeToDelete = nodeToDelete->nextNode;
是有问题的。
因为已经释放了nodeToDelete,所以你不能再使用它了,逻辑本身也不起作用。
我认为遵循的逻辑是:
指向下一个节点。
make head-> previous point to nodeToDelete-> previous
make nodeToDelete-> next指向head
删除nodeToDelete
通过这种方式,您可以使用上一个指向下一个,下一个指向上一个,并删除之间的一个。
类似的东西:
head = nodeToDelete->next;
head->previous = nodeToDelete->previous;
nodeToDelete->next = head;
delete(nodeToDelete);
while(nodeToDelete != NULL)
不是必需的,如果需要,您可以使用if
进行检查,但循环播放这是一个不错的主意。
这是我做过的光彩画,也许它会有所帮助。对不起,我真的很糟糕......
答案 1 :(得分:1)
如果head->值匹配,则在此函数内部改变头部,但这不会改变其他地方的头部。调用者现在有一个指向已删除节点的无效指针,无法找到实际节点。可能是这个无效指针导致后来的调用失败。
此外,如果head->值不匹配,则您搜索列表,但稍后拒绝对其执行任何操作,因为它不是头。没有其他条款。