删除链表中的特定节点
Delete specific Node in 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 = 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
我以 number = 10 运行函数,它返回:
7.5 -> 5
这不是真的,谁能为我解释一下。提前感谢!
你的方法有几个问题。
- 您正在使用静态
flag
。(请参阅其他评论以了解为什么它不好。 - 您正在使用递归。 由于您使用的是静态标志,因此它会搞砸递归。
- 您可以在迭代自身时删除元素,则运行时将为 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;
}
您的起始状态短路列表pHead
,将本地prev
设置为 pHead 的地址。为什么不使用pHead ->prev
或nullptr
?
从双向链表中删除元素是具有时间一致性 O(n( 操作的操作。您必须浏览列表并折叠那些与您的条件匹配的记录。
相关文章:
- 反向给定链表中的K节点
- 我们可以删除链表中静态内存中的节点吗
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 如何按数字顺序插入链表节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 在C++的链表末尾插入一个节点
- 在解决链表问题时创建一个额外的节点是一个好习惯吗?
- 插入一个基本的单向链表节点似乎破坏了我的 c++ 代码?
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 删除链表中的特定节点
- 在 c++ 中,在链表节点上使用括号有什么意义?
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 删除链表中的节点 - 分段错误
- 使用函数引用指向节点的指针删除链表中的节点?
- 节点链表中的对象
- 虚拟头节点链表
- C++ 删除类似的节点链表
- c++删除节点链表导致程序崩溃
- 排序节点(链表)c++