【问题标题】:Deleting a node in a linked list删除链表中的节点
【发布时间】:2013-10-25 11:04:03
【问题描述】:

您好,我正在尝试删除链表中的节点。我首先尝试如何删除头部和尾部节点。头部删除似乎有效,但删除的尾部却没有。当我运行代码时,尾巴的位置被替换为垃圾值。谁能弄清楚为什么?非常感谢!

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

【问题讨论】:

    标签: c++ linked-list


    【解决方案1】:

    考虑 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 后的垃圾),因此您必须确保 node_1 指向 NULL 。即最后但一个应该指向 null 。

    类似

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

    【讨论】:

      【解决方案2】:

      有了这个声明

       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;

      【讨论】:

      • 新条件不起作用,程序仍然崩溃,并在尾部原来的位置打印垃圾值。我已经安排好了 goto del,谢谢你的提示!
      • 非常感谢您的帮助,但我在您之前看到了 MAG 用户的回答。如果可以的话,我会回答两个正确的答案!
      • 别担心!祝你好运!
      【解决方案3】:

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

      【讨论】:

      • 你能解释一下吗?
      • 他的意思是如果你想删除节点3,你必须遍历链表到节点2然后到节点3,删除他然后继续到节点4。现在你必须保存地址节点 2 到节点 4 的前一个地址(如果列表是双链接的),节点 4 到节点 2 的下一个地址。
      【解决方案4】:

      如果你的尾指针和头指针相同怎么办?你不检查它。因此,您可能正在删除您认为是 Head 的指针,它也是 Tail。另外,如果它是头部的 Next 或尾部的 Prev 怎么办?

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-08
        • 2016-01-02
        相关资源
        最近更新 更多