从单排序链表中删除一个元素
remove an element from a singly sorted linked list C++
我有一个排序的链表,我试图创建一个函数来删除任何用户传递给nameToSearch。但总是出错。下面是我到目前为止写的
void deleteProduct(NodePtr head, char* nameToSearch)
{
NodePtr nodeUnderEdit = findNodeByName(head, nameToSearch);
if (nodeUnderEdit == NULL)
{
cout<<"n ERROR: Product not found n";
}
else
{
delete nodeUnderEdit;
nodeUnderEdit = nodeUnderEdit->next;
}
}
delete nodeUnderEdit;
nodeUnderEdit = nodeUnderEdit->next;
如果先删除nodeUnderEdit
,则nodeUnderEdit->next
将丢失。您需要首先确保nodeUnderEdit's next之前的节点连接到nodeUnderEdit->next
,然后您可以执行remove.
对于单链表来说,这总是一个问题。
出现这个问题是因为从链表中删除当前节点需要修改上一个节点中的指针,而您无法直接访问该节点。
处理这个问题的一种方法是使用带有哨兵(sentinel)的列表(包含您可以识别为列表末尾的值的最终节点)。在这种情况下,您可以将下一个节点的值复制到当前节点,然后从列表中删除下一个节点。要删除单链表中的项,必须将指针从上一条记录更改为指向下一条记录。"findNodeByName"仅查找具有匹配名称的节点是不够的。它必须按照排序顺序找到它前面的节点,然后将该记录的Next指针设置为要删除的记录的Next点。只有在更新了上一条记录的Next指针之后,才能删除所搜索的记录。
相关文章:
- lower_bound()返回最后一个元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 访问 for_each 函数中的前一个元素
- 在 QListView 中显示最后一个元素
- 从 std::vector 中选择一个元素,而不是给定元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何从一个无序集合中获取一个元素