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

Fandi

我正在为 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 Add node before to 20: 30 Finish Output 10, 15, 30, 20, 12 Thks

雷米勒博

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

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

完成。

此外,此代码中还有其他一些逻辑错误。当插入之前head节点,你没有更新head->previous在指向newNode节点更新前head本身。并且由于您的函数给定节点之前插入,您根本不应该尝试节点之后插入last,该作业应该由单独的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;
}

演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章