2014-03-12 47 views
1

我似乎无法找出问题所在的最后一个节点,我的代码编译和运行过去有问题的功能,如下图所示,但是当我尝试显示所有节点的内容,我得到这个:删除C++中的链表

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; 
} 

回答

0

我认为应该是:

pPrevPtr = pCurr; 
pCurr = pCurr->pNextNode; 

不要忘记解除连结。之后简单地将pPrevPtr设置为NULL不会影响您的列表。你可能想:

if (pPrevPtr) pPrevPtr->pNextNode = NULL; 
+0

为什么取消链接? OP只想删除最后一个,没有提到关于解除链接 – 4pie0

+0

@lizusek他们很可能忘记提到这个 – martynas

+1

@lizusek为什么你会删除节点,然后在列表中留下一个指向它的指针?这是非常麻烦的问题,我对你的评论感到惊讶。 – paddy

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

而且,你为什么返回pHead?它是函数的参数,并且被返回不变。显然你也应该取消链接已删除的节点。

delete pCurr; 
if (pPrevPtr) pPrevPtr->pNextNode = NULL; 
1

它必须是:

while (pCurr->pNextNode != NULL) 
{ 
    pPrevPtr = pCurr; 
    pCurr = pCurr->pNextNode; 
} 
  1. 循环,直到你的pCurr到达终点(即下一个节点是NULL)
  2. 的pPrevPtr将成为新的尾部
  3. 集pPrevPtr未来为NULL(解引用老尾)
0

你的c ode有几个错误。例如,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; 
}