C++ 删除链表中的特定节点

C++ 删除链表中的特定节点,c++,linked-list,C++,Linked List,我有一个这样的链表 struct product { string ID; double quantity; product* next = NULL; }; 我想删除所有数量小于一个数字的产品。 如果至少删除了一个产品,则此函数返回true,否则返回false。这是我的密码 bool deleteProducts(product*& pHead, double quantity) { static int flag = 0; product* pTemp = pHea

我有一个这样的链表

struct product {
string ID;
double quantity;
product* next = NULL;
};
我想删除所有数量小于一个数字的产品。 如果至少删除了一个产品,则此函数返回true,否则返回false。这是我的密码

bool deleteProducts(product*& pHead, double quantity) {
    static int flag = 0;
    product* pTemp = pHead;
    product* prev = pHead;
    if (pTemp != NULL && pTemp->quantity <= quantity) pHead = pTemp->next;
    while (pTemp != NULL && pTemp->quantity > quantity) {
        prev = pTemp;
        pTemp = pTemp->next;
    }
    if (pTemp == NULL) return flag;
    flag = 1;
    prev->next = pTemp->next;
    deleteProducts(prev->next, quantity);
}
我运行quantity=10的函数,它返回:

7.5 -> 5

这不是真的,有人能为我解释一下吗。提前谢谢

将起始状态短路列表设置到
pHead
,将本地
prev
设置为pHead的地址。为什么不使用
pHead->prev
nullptr


从双链表中删除元素的操作是时间压缩O(n)操作。您必须遍历列表并折叠符合条件的记录。

您的方法有几个问题

  • 您使用的是静态
    标志
    。(请参阅其他注释,了解其不好的原因。)
  • 你在使用递归。 因为您使用的是静态标志,所以它会破坏递归
  • 您可以在迭代自身时删除元素,那么运行时将是O(n)
  • 您可以使用双链接列表来避免在循环中使用
    pPrev
  • 这是我想出的正确解决办法

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    typedef struct product {
        string ID;
        double quantity;
        product* next = NULL;
    } product;
    
    product* deleteProducts(product*& pHead, double quantity) {
        product* pTemp = pHead;
        product* pPrev = pHead;
    
        while (pTemp != NULL) {
            if ( pTemp->quantity > quantity ){
                if ( pTemp == pHead ){
                    cout << "Deleteing Current Head " <<  pTemp->quantity << endl;
                    product* pTmp = pHead;
                    pTemp = pTemp->next;
                    pHead = pPrev = pTemp;
                    delete pTmp;
                }
                else{
                    cout << "Deleteing Node" <<  pTemp->quantity << endl;
                    product* pNext = pTemp->next;
                    delete pTemp;
                    pTemp = pNext;
                    pPrev->next = pTemp;
                }
            }
            else{        
                pPrev = pTemp;
                pTemp = pTemp->next;
            }
        }
    
        return pHead;
    }
    
    bool printProducts(product*& pHead) {
        product* pTemp = pHead;
    
        while (pTemp != NULL) {
            cout << pTemp->quantity << " ";
            pTemp = pTemp->next;
        }
    
        cout << endl;
    }
    
    int main()
    {
       product* p1 = new product{"1", 7};
       product* p2 = new product{"2", 7.5};
       product* p3 = new product{"3", 2};
       product* p4 = new product{"4", 5};
       product* p5 = new product{"5", 6};
    
       p1->next = p2;
       p2->next = p3;
       p3->next = p4;
       p4->next = p5;
    
       if ( deleteProducts(p1, 10) ){
           cout << "Done" << endl;
       }
    
       printProducts(p1);
    
       return 0;
    }
    
    #包括
    #包括
    使用名称空间std;
    typedef结构产品{
    字符串ID;
    双倍数量;
    product*next=NULL;
    }产品;
    产品*删除产品(产品*和pHead,双倍数量){
    产品*pTemp=pHead;
    产品*pPrev=pHead;
    while(pTemp!=NULL){
    如果(pTemp->数量>数量){
    如果(pTemp==pHead){
    下一步;
    }
    }
    返回pHead;
    }
    布尔打印产品(产品*&pHead){
    产品*pTemp=pHead;
    while(pTemp!=NULL){
    其次是数量;
    }
    cout-next=p2;
    p2->next=p3;
    p3->next=p4;
    p4->next=p5;
    如果(删除产品(p1,10)){
    
    为什么
    flag
    是静态的呢?一旦删除了一个节点,函数将始终返回
    true
    @molbdnilo,因为每个递归循环之后,尽管有已删除的节点,但标记将为0。它的
    是静态的
    ,所以它只初始化一次,这是第一次调用函数。是什么让你在这里使用递归的呢?RemLList中的oving元素始终为O(n)。只需遍历列表并删除符合删除条件的元素。要调试它,请坐下来用一张纸和一支铅笔画出列表和所有指针。这是调试面向指针的算法和结构的最佳方法。
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    typedef struct product {
        string ID;
        double quantity;
        product* next = NULL;
    } product;
    
    product* deleteProducts(product*& pHead, double quantity) {
        product* pTemp = pHead;
        product* pPrev = pHead;
    
        while (pTemp != NULL) {
            if ( pTemp->quantity > quantity ){
                if ( pTemp == pHead ){
                    cout << "Deleteing Current Head " <<  pTemp->quantity << endl;
                    product* pTmp = pHead;
                    pTemp = pTemp->next;
                    pHead = pPrev = pTemp;
                    delete pTmp;
                }
                else{
                    cout << "Deleteing Node" <<  pTemp->quantity << endl;
                    product* pNext = pTemp->next;
                    delete pTemp;
                    pTemp = pNext;
                    pPrev->next = pTemp;
                }
            }
            else{        
                pPrev = pTemp;
                pTemp = pTemp->next;
            }
        }
    
        return pHead;
    }
    
    bool printProducts(product*& pHead) {
        product* pTemp = pHead;
    
        while (pTemp != NULL) {
            cout << pTemp->quantity << " ";
            pTemp = pTemp->next;
        }
    
        cout << endl;
    }
    
    int main()
    {
       product* p1 = new product{"1", 7};
       product* p2 = new product{"2", 7.5};
       product* p3 = new product{"3", 2};
       product* p4 = new product{"4", 5};
       product* p5 = new product{"5", 6};
    
       p1->next = p2;
       p2->next = p3;
       p3->next = p4;
       p4->next = p5;
    
       if ( deleteProducts(p1, 10) ){
           cout << "Done" << endl;
       }
    
       printProducts(p1);
    
       return 0;
    }