如何在双向链表c ++之前添加节点

How add node before doubly linked list c++

我正在用 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 谢谢

您必须了解如何有条不紊地(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;

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

  • 设置newNode->previous指向before->previous节点
  • 设置newNode->next指向before节点
  • 如果before->previous不为空,设置before->previous->next指向newNode节点
  • 设置before->previous指向newNode节点
  • 如果 before 指向 head 节点,设置 head 指向 newNode 节点。

完成。

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

试试像这样的东西:

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