删除链接列表中的节点

时间:2013-10-25 11:04:04

标签: c++ linked-list

您好我正在尝试删除链接列表中的节点。我首先尝试如何删除头部和尾部节点。头部删除似乎有效,但尾部删除不起作用。当我运行代码时,尾部曾经的位置被替换为垃圾值。任何人都可以找出原因吗?非常感谢!

void CList :: Remove() {

    int data = NULL;

    std::cout<<"Enter value you wish to remove ";
    std:: cin>> data;

    cNode *pMyPointer = m_pHead;

    while (pMyPointer != NULL)
    {
        if (pMyPointer->m_nValue == data) {
            std::cout << "Element found";
            goto del;
        }

        else {
            pMyPointer = pMyPointer->m_pNext;
        }   
    }

    del:

    //removing the head
    if (pMyPointer == m_pHead)
        m_pHead= m_pHead->m_pNext;
    //removing the tail
    else if (pMyPointer == m_pTail)
        m_pTail = m_pTail->m_pPrev;

    delete pMyPointer;
}

4 个答案:

答案 0 :(得分:2)

将node_1指向node_2(仅为2个节点) 看看这段代码

else if (pMyPointer == m_pTail)
        m_pTail = m_pTail->m_pPrev;

node_1指向node_2。它仍指向那里。一旦删除了node_2,node_1仍将指向node_2(或删除node_2后的垃圾)&amp;所以你必须确保node_1指向NULL。即最后但是应该指向null。

类似

else if (pMyPointer == m_pTail)
    m_pTail->m_pPrev->next=NULL;
    m_pTail = m_pTail->m_pPrev;

答案 1 :(得分:1)

使用此声明

 while (pMyPointer != NULL)

当指针退出循环时,它可能指向NULL,因此它将跳过尾指针。

而是尝试

while (pMyPointer->m_pNext != NULL)

您还需要使倒数第二个节点指向NULL。

else if (pMyPointer == m_pTail) {
  m_pTail = m_pTail->m_pPrev;
  m_pTail->m_pNext = NULL;
}
delete pMyPointer;

此外,只需使用goto del

,而不是break;

答案 2 :(得分:0)

将一个节点保留在要删除的节点之前

答案 3 :(得分:0)

如果你的尾巴和头部指针相同怎么办?你没有检查它。因此,您可能正在删除您认为是Head的指针,也就是Tail。再加上如果它是下一个头部或上一个尾部的话?

void CList :: Remove() {

    int data = NULL;

    std::cout<<"Enter value you wish to remove ";
    std:: cin>> data;

    cNode *pMyPointer = m_pHead;

    while (pMyPointer != NULL)
    {
        if (pMyPointer->m_nValue == data) {
            std::cout << "Element found";
            goto del;
        }

        else {
            pMyPointer = pMyPointer->m_pNext;
        }   
    }

    del:

     //taking care of the neighbors
    if (pMyPointer->m_pPrev)
        pMyPointer->m_pPrev->m_pNext = pMyPointer->m_pNext;
    if (pMyPointer->m_pNext)
        pMyPointer->m_pNext->m_pPrev = pMyPointer->m_pPrev;
    // removing the head
    if (pMyPointer == m_pHead)
        m_pHead= m_pHead->m_pNext;
    //removing the tail
    if (pMyPointer == m_pTail)
        m_pTail = m_pTail->m_pPrev;

    delete pMyPointer;
}