从链接列表C++中删除特定值



所以这个问题可能有点奇怪,但现在开始。

我遇到了一个函数问题,该函数在有序链表中搜索特定值,并删除它遇到的第一个包含目标值的节点。我遇到的问题是,每当我向它传递一个不在链表上的值,或者试图通过运行它来删除目标值的所有副本,直到它返回false(表示"未找到")时,它就会抛出Seg错误。

我解决了这个问题,但我不太明白为什么我所做的更改解决了我所面临的问题,因为对我来说,这些方法似乎是等效的。我在下面发布了"之前和之后",我想知道更有经验的人是否可以重新审视一下,并解释为什么我所做的更改解决了我描述的问题。

修复前:

bool deleteNode(Node *&headRef, int delVal)
{
    Node *delPtr; // for use in deletion
    Node *scan;   // "                        "
    Node *prev;   // "                        "
    if( headRef != nullptr ) {
        if( headRef->data == delVal ) {
            delPtr = headRef;
            headRef = headRef->next;
            delete delPtr;
        } else {
            scan = headRef->next;
            prev = headRef;
            while( scan != nullptr && scan->data != delVal ) {
                scan = scan->next;
                prev = prev->next;
            }
            if( scan->data == delVal ) {
                delPtr = scan;
                prev->next = delPtr->next;
                delete delPtr;
            } else return false;
        }
    }
    return true;
}

之后(已标记更改):

bool deleteNode(Node *&headRef, int delVal)
{
    Node *delPtr; // for use in deletion
    Node *scan;   // "                        "
    Node *prev;   // "                        "
    if( headRef == nullptr )         // *CHANGE #1*
        return false;
    if( headRef->data == delVal ) {
        delPtr = headRef;
        headRef = headRef->next;
        delete delPtr;
    } else {
        scan = headRef->next;
        prev = headRef;
        while( scan != nullptr && scan->data != delVal ) {
            scan = scan->next;
            prev = prev->next;
        }
        if( scan != nullptr ) {      // *CHANGE #2*
            delPtr = scan;
            prev->next = delPtr->next;
            delete delPtr;
        } else return false;
    }
    return true;
}

提前感谢你的帮助。

此处:

if(scan->data == delVal)

scan可能为null,并且您不进行检查;在第二个版本中,您检查它是否为null,但不检查该值是否与要删除的值匹配。也许你想要这个?

if(scan != nullptr && scan->data == delVal)

相关内容

  • 没有找到相关文章

最新更新