c++ - 多次优化递归双链表删除节点

标签 c++

我编写了一个递归双向链接 C++ 函数来删除双向链表中具有特定值的所有节点。是否可以对此进行优化?谢谢。

struct marynode {
    int value;
    marynode* next;
    marynode* prev;
};

void DoubleLinkedListDeleteMultiple(marynode*& llist, int value){
    marynode* tmp = llist;

    if (llist == NULL)
        return;

    if (llist->value == value){
            DoubleLinkedListDeleteMultiple(llist->next, value); 
            if (llist->next == NULL){
                marynode* prev = llist->prev;
                delete llist;
                llist = NULL;
                llist = prev;
                if (llist)
                    llist->next = 0;
            }   
            else if (llist->prev == NULL){
                marynode* next = llist->next;
                delete llist;
                llist = NULL;
                llist = next;
                if (llist)
                    llist->prev = 0;
            }   
            else{
                marynode *x = llist;
                marynode  *mynext = x->next;
                while (x){
                    if (x->value == value){
                        marynode* clara = x->next;
                        marynode* zprev = x->prev;
                        delete x;
                        x = NULL;
                        x = clara;
                        llist = clara;
                        if (llist)
                            llist->prev = zprev;
                    }
                    else {
                        x = mynext;
                    }   
                    if (mynext){
                        mynext = mynext->next;
                    }
                }

            }
    }
    else{
            DoubleLinkedListDeleteMultiple(llist->next, value); 
    }
}

最佳答案

std::list 有问题吗?

此外,结构 + 全局函数?您可能想改用面向对象的结构,例如成员方法。

为了稍微优化此特定代码,我会将您的递归调用更改为 while 循环。

while(llist != NULL) {
     if(llist->value == value) {
          if(llist->prev) {
              llist->prev->next = llist->next;
          }
          if(llist->next) {
              llist->next->prev = llist->prev;
          }
          node* next = llist->next;
          delete llist;
          llist = next;
     } else {
         llist = llist->next;
     }
}

关于c++ - 多次优化递归双链表删除节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6794731/

相关文章:

c++ - 在 C++ 中为 BST 类(不同类型的键)制作模板

c++ - 如何使用 memcpy 返回从函数修改的两个数组?

C++ 获取程序打开套接字的句柄

c++ - 带有结构的自定义排序功能

c++ - 为什么存储在数组中的 double 值会消失?

c++ - 按类型大小递增 void* 的正确方法,因为转换结果是临时的,而不是左值

c++ - CSource 过滤器上的 SetMediaTime 使输出 AVI 变得毫无意义 - 知道为什么吗?

c++ - 模板函数返回 void

c++ - `void operator=(T&&)` 和 `T& operator=(T&&)` 有什么区别?

c++ - 如何在C++中生成随机字符串