【问题标题】:how to delete current linked list node without tracking previous node如何在不跟踪前一个节点的情况下删除当前链表节点
【发布时间】:2021-06-02 15:40:49
【问题描述】:

我想知道是否可以在 C++ 中按值删除链表中的节点而不跟踪“先前”和“当前”节点。

我所做的是将下一个节点的信息复制到当前节点,将当前节点链接到下一个节点,然后删除下一个节点。

我尝试过类似下面的方法。但是,这仅在要删除的节点不是最后一个节点时才有效。我无法弄清楚如何容纳最后一个节点。

struct Node
{
    int data;
    Node* next;
};

void LinkedList::deleteNode(int item)
{
    Node* tmpNode = m_head;

    while (tmpNode != nullptr)
    {
        if (tmpNode->data == item)
        {
            if (tmpNode->next != nullptr) // not last node
            {
                // this works
                Node* delNode = tmpNode->next;
                tmpNode->data = tmpNode->next->data;
                tmpNode->next = tmpNode->next->next;
                delete delNode;
            }
            else // last node
            {
                // this does not work
                delete tmpNode;
                tmpNode = nullptr;
            }
            std::cout << "deleted item " << item << '\n';
            return;
        }
        tmpNode = tmpNode->next;
    }
    std::cout << "delete failed: item " << item << " not found\n";
}

【问题讨论】:

  • 如果你删除了实际的节点,它会工作并且效率更高。诀窍是跟踪您在循环中访问的上一个节点。将其 next 设置为当前节点的 next 并删除该节点。特殊情况是它是第一个或最后一个节点,但可以用几行额外的句柄来处理。
  • lakeweb 是正确的。您的代码不是您想要的原因是因为您实际上是在将数据复制到当前节点之后删除 next 节点。如果它是最后一个节点,则没有要删除的下一个节点。如果不引用前一个节点,则无法删除当前节点。

标签: c++ linked-list


【解决方案1】:

删除节点时,必须将上一个节点的next设置为nullptr。否则,它将一直指向已删除的节点。

建议:

在函数的开头,创建:

Node* previousTmpNode = nullptr;

扫描链表时存储上一个节点的地址:

Node* previousTmpNode = tmpNode ; //call right before tmpNode = tmpNode->next;

然后调用:

previousTmpNode->next = nullptr; //call right after you deleted the last element.

或者,改变你的节点,使它们向后指向(双链表)。

【讨论】:

    【解决方案2】:

    由于这可能是一项练习/家庭作业,我将在 sudo(未经测试)庄园中回答。它只适用于最后一个节点。

    Node* prev = nullptr;
    for(auto track = m_head; track; track = track->next){
       if(track->data != item)
          continue;
       if(!prev){
          m_head = track->next;
          delete track;
          break;
       }
       prev->next = track->next;
       delete track;
       break;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-17
      • 2011-12-23
      • 2021-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2023-04-03
      • 1970-01-01
      相关资源
      最近更新 更多