从单排序链表中删除一个元素

remove an element from a singly sorted linked list C++

本文关键字:一个 元素 删除 链表 单排序 排序      更新时间:2023-10-16

我有一个排序的链表,我试图创建一个函数来删除任何用户传递给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指针之后,才能删除所搜索的记录。