c++ - 在 C++ 中删除有序链表中的节点
问题描述
我正在处理 C++ 中的有序链表。任务是从列表中删除笔记,我有两种方法/函数可以做到这一点。
/*
* delete_head: Auxiliary function that deletes the first node of the list.
*/
book *delete_head(book*& deleteNode){
head = deleteNode->next;
delete deleteNode;
return head;
}
/*
* delete_node: Method that deletes a node from the list.
*/
void delete_node(int c){
book *aux = head;
// Verify list isn't empty.
if (head != NULL){
// Case 1: the head should be deleted.
if (aux->code == c){
head = delete_head(head);
} else {
book *aux2 = head->next;
while (aux2 != nullptr && aux2->code < c){
aux = aux2;
aux2 = aux2->next;
}
// Case 2: node wasn't found.
if (aux2 == NULL){
printf("Error: Node doesn't exist. \n");
} else {
// Case 3: the tail should be removed.
if (aux2->next == NULL){
aux->next = NULL;
delete aux2;
} else {
// Case 4: A node from the middle should be removed.
aux->next = aux2->next;
delete aux2;
}
}
}
} else {
printf("Error: Empty list. \n");
}
}
我已经测试了代码和删除列表尾部或中间节点的情况确实有效。给我带来一些麻烦的是我需要删除头部的情况,我不确定它是否与指针的处理方式有关。
解决方案
您的辅助功能很无聊:
book *delete_head(book*& deleteNode){
head = deleteNode->next;
delete deleteNode;
return head;
}
你用 来调用它head = delete_head(head);
,但是当你这样做时,它deleteNode
被设置为对指向头的指针的引用。这意味着你对你做的任何事情deleteNode
也会对你做head
——反之亦然。
这意味着在这里:delete deleteNode;
您删除了两个 deleteNode
and head
,这在您返回时有点问题head
。
将功能更改为book *delete_head(book* deleteNode){
,它应该做你想做的事。
推荐阅读
- javascript - d3.js:更改(向下钻取)在 selection.each() 中绑定的数据
- python - 使用 Mailgun API 通过 Python 发送电子邮件
- angular - 带有 retryWhen 的 rxjs 单元测试
- c - C:带保护的降序插入排序
- angular - Angular 6 - 错误:JSONP 注入脚本未调用回调
- keras - Keras 中的矩阵大小不兼容问题
- python-2.7 - 如果你有很多 elif,你有什么需要改变的吗?
- php - 您如何处理排队系统中的多个用户?
- javascript - Highcharts 卡在平移上
- php - Symfony 3.4 - form_errors 表单主题不显示