【问题标题】:How add node before doubly linked list c++如何在双向链表c ++之前添加节点
【发布时间】:2021-02-22 22:22:51
【问题描述】:

我正在为 C++ 中的双链表编写代码。但是,我有一个问题,我不知道如何在其他节点之前添加节点。 我有这些。

template<class T>
void LinkedListD<T>::addNodeBeforeTo(Node<T> *before, T info) {
    Node<T>* newNode = new Node<T>( info );
    if ( isEmpty() ){
        head = newNode;
        last = newNode;
    } else{
        if ( before == head ){
            newNode->next = head;
            head = newNode;

        } if ( before == last ){
            newNode->previous = last;
            last = newNode;
        }
        else{
            Node<T>* act = head;
            Node<T>* past = last;
            while ( act->next != before && past->previous != before){
                act = act->next;
                past = past->previous;
            }
            newNode->previous = past->previous;
            newNode->next = act->next;
            act->next = newNode;
            past->previous = newNode;
        }
    }
}

示例是 10、15、20、12 在 20:30 之前添加节点 完成输出 10、15、30、20、12 谢谢

【问题讨论】:

  • 您有一个 while 循环,似乎正在搜索前节点……您为什么要这样做?您已经有一个指向前节点的指针,并且因为这是一个双向链表,所以前节点知道前一个节点和下一个节点。这就是您需要的所有信息。代码中不应有循环。因为这似乎是一个家庭作业问题,所以我不打算直接发布代码。
  • 对不起,如果我使用了while,但我依赖于一个简单的链表。使用双重列表,无需遍历节点

标签: c++ pointers doubly-linked-list


【解决方案1】:

您必须了解如何处理解决方案,有条不紊地(n 是您要在它之前插入 new_item 对象的对象):

if (head != nullptr) // i.e. if list is not empty
{

}

if (new_item.P == nullptr) // i.e. if new_item is first
     head = new_item;

【讨论】:

  • 好的。那么是不是必须要最后一项呢?
  • @Fandi ,“必要”不是。如果您想在最后一个项目之后添加项目 或从最后一个项目反向迭代到第一个项目 更有效 即不通过到达最后一个对象,它是可选的第一个。但无论如何,这个问题与你在标题中的问题无关。
【解决方案2】:

您根本不需要while 循环。每个节点都知道它两侧的节点,这就是正确更新列表所需的全部内容。给定输入节点before,你所要做的就是:

  • 设置newNode-&gt;previous指向before-&gt;previous节点
  • 设置newNode-&gt;next 指向before 节点
  • 如果before-&gt;previous不为空,设置before-&gt;previous-&gt;next指向newNode节点
  • 设置before-&gt;previous 指向newNode 节点
  • 如果before 指向head 节点,则将head 设置为指向newNode 节点。

完成。

此外,此代码中还有一些其他逻辑错误。在head 节点之前 插入时,您不会在更新head 本身之前更新head-&gt;previous 以指向newNode 节点。而且由于您的函数在给定节点 before 插入,因此您根本不应该尝试在 last 节点 after 插入,该作业应该由单独的 @987654342 处理@ 方法。

试试这样的:

template<class T>
Node<T>* LinkedListD<T>::addNodeBeforeTo(Node<T> *before, const T &info) {
    if ( !before ) return nullptr;
    Node<T>* newNode = new Node<T>( info );
    newNode->previous = before->previous;
    newNode->next = before;
    if ( before->previous )
        before->previous->next = newNode;
    before->previous = newNode;
    if ( before == head )
        head = newNode;
    return newNode;
}

Demo

【讨论】:

  • 我试过了。我稍后要添加另一种方法,问题在于它何时显示节点,因为我有另一种 bool 方法可以从后到前显示,反之亦然。我已经更改它,好像它显示一个正常的列表并且它已经工作了
  • 对于head的问题:解决方法在if( before == head ) newNode->next = head head = newNode;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
  • 2021-01-07
  • 2011-03-12
相关资源
最近更新 更多