我正在尝试为有序链表编写删除算法。搜索和遍历我认为我已经失败但是删除让我适合。它每次都会崩溃。有人可以帮我解决这个问题吗?
我的ListNode
课程中有一个名为head
的{{1}}结构的私有指针。 TestLL
结构包含ListNode
,int Key
和double dataValue
。如果找到并删除了要删除的节点,则该函数返回ListNode *next
;如果找不到,则返回true
。
我的代码:
false
答案 0 :(得分:0)
该功能可以查看以下方式(不测试)
bool TestLL::Delete( int key )
{
ListNode *prev = nullptr, *current = head;
while ( current && !( current->key == key ) )
{
prev = current;
current = current->next;
}
if ( !current ) return false;
if ( prev ) prev->next = current->next;
else head = head->next;
delete current;
return true;
}
答案 1 :(得分:0)
在同一指针上同时使用delete
和free
肯定是个问题。
new
分配内存,请使用delete
malloc
,请提醒您自己使用的是C ++,并将其替换为new
。如果back == NULL
,则表示:
head
是NULL
(在这种情况下,仅return false
)或head
处的元素,即head = head->next; delete temp;
)如果temp == NULL
,则表示找不到该元素 - 您在这里正确地return false
。
如果temp != NULL
,您需要删除temp
:back->next = temp->next; delete temp;
。
但只是使用指向指针的指针似乎更简单:
bool TestLL::deleteKey(int key)
{
ListNode **current = &head;
while (*current != NULL)
{
if ((*current)->key == key)
{
ListNode *temp = *current;
*current = (*current)->next;
delete temp;
return true;
}
current = &(*current)->next;
}
return false;
}