C++ 删除C+中链接列表的最后一个节点+;

C++ 删除C+中链接列表的最后一个节点+;,c++,singly-linked-list,C++,Singly Linked List,我似乎不知道问题出在哪里,我的代码编译并运行了下面所示的有问题的函数,但当我试图显示所有节点的内容时,我得到了以下结果: LinkedList.exe中0x50CE1F98(msvcp100d.dll)处未处理的异常:0xC0000005:访问冲突读取位置0xFEEEFEEE //remove (and cleanup after) the node at the tail of the LinkedList (pHead) //return a pointer to the head node

我似乎不知道问题出在哪里,我的代码编译并运行了下面所示的有问题的函数,但当我试图显示所有节点的内容时,我得到了以下结果:

LinkedList.exe中0x50CE1F98(msvcp100d.dll)处未处理的异常:0xC0000005:访问冲突读取位置0xFEEEFEEE

//remove (and cleanup after) the node at the tail of the LinkedList (pHead)
//return a pointer to the head node
ListNode* removeEnd( ListNode* pHead )
{
    ListNode* pCurr = pHead;
    ListNode* pPrevPtr = NULL;

    while (pCurr->pNextNode != NULL)
    {
        pCurr = pCurr->pNextNode;
        pPrevPtr = pCurr->pNextNode;
    }


    pPrevPtr = NULL;

    delete pCurr;

    return pHead;
}

我认为应该是:

pPrevPtr = pCurr;
pCurr = pCurr->pNextNode;
别忘了把它拆开。之后只需将
pPrevPtr
设置为NULL,不会影响列表。您可能想要:

if (pPrevPtr) pPrevPtr->pNextNode = NULL;
另外,为什么返回
pHead
?它是函数的参数,返回时保持不变。显然,您还应该取消已删除节点的链接

delete pCurr;
if ( pPrevPtr ) pPrevPtr->pNextNode = NULL;
它必须是:

while (pCurr->pNextNode != NULL)
{
    pPrevPtr = pCurr;
    pCurr = pCurr->pNextNode;
}
  • 循环,直到pCurr到达终点(即下一个节点为NULL)
  • pPrevPtr将成为您的新尾巴
  • 在NULL旁边设置pPrevPtr(取消引用旧尾部)

  • 你的代码有几个bug。例如,pHead可以等于NULL,或者您在此处错误地设置了pPrevPtr pPrevPtr=pCurr->pNextNode;这里pPrevPtr=NULL

    请尝试以下代码

    ListNode* removeEnd( ListNode* pHead )
    {
        if ( pHead )
        {
           ListNode* pCurr = pHead;
           ListNode* pPrevPtr = NULL;
    
           while ( pCurr->pNextNode != NULL)
           {
              pPrevPtr = pCurr;
              pCurr = pCurr->pNextNode;
           }
    
           delete pCurr;
           if ( pPrevPtr ) pPrevPtr->pNextNode = NULL;
           else pHead = pPrevPtr; 
        }    
    
        return pHead;
    }
    

    为什么要取消链接?OP只想删除最后一个,没有提到unlinking@lizusek很可能他们只是忘了提this@lizusek你究竟为什么要删除节点,然后在列表中留下指向它的指针?这太麻烦了,我对你的评论感到惊讶。啊,没关系,我以为你的意思是把所有的链接都断开nodes@lizusek哦,我明白你是怎么想的。因为我没有显示实际的循环代码,然后我提到了在循环之后发生的一些事情。很公平=)
    ListNode* removeEnd( ListNode* pHead )
    {
        if ( pHead )
        {
           ListNode* pCurr = pHead;
           ListNode* pPrevPtr = NULL;
    
           while ( pCurr->pNextNode != NULL)
           {
              pPrevPtr = pCurr;
              pCurr = pCurr->pNextNode;
           }
    
           delete pCurr;
           if ( pPrevPtr ) pPrevPtr->pNextNode = NULL;
           else pHead = pPrevPtr; 
        }    
    
        return pHead;
    }