gpt4 book ai didi

c++ - 删除链表中的特定节点

转载 作者:行者123 更新时间:2023-11-30 04:56:39 25 4
gpt4 key购买 nike

我有一个这样的链表

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);
}

但是当我有一个像这样的列表(只有数量)时:

7 -> 7.5 -> 2 -> 5 -> 6

然后我运行数量为 10 的函数,它返回:

7.5 -> 5

这不是真的,谁能帮我解释一下。提前致谢!

最佳答案

您的方法有几个问题。

  1. 您正在使用静态标志。 (查看其他评论以了解它为什么不好。)
  2. 你正在使用递归。由于您使用的是静态标志,因此它会搞砸递归。
  3. 您可以在迭代自身的同时删除元素,那么运行时间为 O(n)。
  4. 您可以使用双向链表来避免在循环中使用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;
}

关于c++ - 删除链表中的特定节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52403819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com