以下代码似乎可以从链表中删除节点:
bool remove(node * & head, int toBeRemoved)
{
if (head == nullptr) //empty list
return false;
else {
node * temp = head;
//the first node needs to be removed
if (head->data == toBeRemoved) {
head = head->next;
delete temp;
return true;
}
//seek for node and remove it
else {
while (temp->next != nullptr && temp->next->data != toBeRemoved)
temp = temp->next;
if (temp->next->data == toBeRemoved){
node * removeThis = temp->next;
temp->next = temp->next->next;
delete removeThis;
return true;
}
//data to be removed can't be found in the list
else
if (temp->next == nullptr && temp->next->data != toBeRemoved)
return false;
}
}
}
(我知道C ++中有一个列表实现,但我只是试图在这里理解这个算法,而不是用其他东西替换它。)
即使代码在删除位于列表开头,列表之间或末尾的节点并且我没有看到任何错误时仍然有效,我仍然对以下行感到疑惑:{{1 }}。
由于当要删除的节点是最后一个节点(即:if (temp->next->data == toBeRemoved)
)时,可以执行整个块,因此我想知道尝试访问temp->next==nullptr
的安全性。< / p>
即使它是安全的,这是一个糟糕的编程习惯吗?
答案 0 :(得分:3)
不,那条线不安全。
当while
为空指针或temp->next
包含要删除的值时,temp->next->data
循环结束。如果它因第一个原因而结束,那么访问temp->next->data
是无效的,因为它通过空指针进行间接。
在while
循环结束后,您应该更改测试的顺序。首先检查空指针。如果它不是空指针,则表示您找到了该元素,您可以将其删除。
while (temp->next != nullptr && temp->next->data != toBeRemoved) {
temp = temp->next;
}
if (temp->next == nullptr) { // data couldn't be found
return false;
} else { // data was found, remove it
node * removeThis = temp->next;
temp->next = temp->next->next;
delete removeThis;
return true;
}
}