C++正在从列表中间删除节点

C++ deleting node from middle of list

本文关键字:中间 删除 节点 列表 C++      更新时间:2023-10-16

所以我在一个夏季OO类中,我们需要编写一个函数来从链表中间删除一个节点。我真的很接近,但有一些问题。我的代码成功地遍历了链表,但一旦循环找到节点,就很难真正删除节点。到目前为止,我的功能是:

template< class NODETYPE >
bool List< NODETYPE >::removeMiddle( NODETYPE &value, int i )
{
    ListNode <NODETYPE> * tempPtr = firstPtr;
    ListNode <NODETYPE> * prevPtr ;
    int counter=1;
    if ( isEmpty() )
        return false;
    if (i <= 0)
        return false;
    while (tempPtr != 0 && counter < i){
        counter++;
        if ( firstPtr == lastPtr )
        firstPtr = lastPtr = 0;
    else
        firstPtr = firstPtr->nextPtr;
            prevPtr = tempPtr;
            tempPtr = tempPtr->nextPtr;
        }
        if (counter == i){
            value = tempPtr->data;  // data being removed
            delete tempPtr;
        }
    }
    return true;
    RecordCounter--;
}

您忘记更改上一个节点,使其不再指向您删除的节点。

你想要的东西(很大程度上)类似于:

if ( counter == i-1 ) //next node is the one you want to delete
{
    aux = tempPtr->nextPtr->nextPtr;   //retain next next node
    delete tempPtr->nextPtr;           //delete next node
    tempPtr->nextPtr = aux;            //current node now points to the node after the deleted one
}

在没有更多细节的情况下,我的第一个猜测是您没有维护列表的完整性。尽管我对C++非常生疏。

您正在删除tempPtr并跟踪prevPtr。。。但是在删除之后不重新链接列表的两半。

prevPtr->nextPtr = tempPtr->nextPtr

您忘记了调整列表中的链接。节点在delete之后仍然存在,但现在它是无效的。哎呀!

此功能很有用:

NODETYPE* unlink( NODETYPE*& pNode )
{
    NODETYPE* const result = pNode;
    pNode = pNode->nextPtr;
    return result;
}

称之为传入指向要删除的节点的nextPtr。返回一个指向该节点的指针,并重新链接列表,使该节点不再在列表中。现在您可以delete该节点。

如果只有一个指向要删除的节点的指针,并且列表是单独链接的,该怎么办?唐纳德·克努思(Donald Knuth)曾在他的《计算机编程艺术》(The Art of Computer Programming)中问过这个问题(如果我没记错的话)。一种解决方案是与下一个节点交换数据,然后删除下一个结点。