删除链表中的节点
Delete nodes in a linked list
我知道有很多关于从链表中删除节点的问题。但是我的脑子卡在一个点上,我无法清除我的困惑。
我有一个链表,其中有节点1 2 2。我想从其中删除结点2。我的代码只删除2的第一个节点,而不是第二个节点。简而言之,我想删除与用户给出的键匹配的所有节点。下面是我的代码:
void LinkedList::Delete(int key)
{
if(head == 0)
return;
if(head->data == key)
{
Node *p = head;
head = head->next;
delete p;
}
else
{
Node *prev = 0;
Node *temp = head;
while(temp!=0)
{
if(temp->data == key)
{
Node *q = temp;
temp = temp->next;
prev = temp;
delete q;
}
else
{
prev = temp;
temp = temp->next;
}
}
}
}
如果我注释掉else
部分,那么它在最后一行即temp=temp->next
给了我访问冲突错误,我知道问题是,如果它在最后一个节点,它应该指向哪个节点!
在下面的代码片段中,删除后,您的temp没有指向下一个节点。因此,一旦你删除了"2"的第一个条目,循环就停止了。
if(temp->data == key)
{
prev->next = temp->next;
temp = 0;
delete temp;
}
试着在IF块中做下面的操作。
itemToDelete = temp;
temp = temp->next;
delete itemToDelete;
这是典型的c++初学者的错误,我敢打赌,当我写完这个答案时,会有很多答案告诉你如何删除指针(提示:先删除,然后取消——如果你需要的话)。
为了完整起见,您可以避免检查prev
指针,并使用指针对指针来简化代码。
void LinkedList::Delete(int key)
{
for (Node** pp = &head; *pp; pp = &(*pp)->next)
{
Node* p = *pp;
if (p->data == key)
{
*pp = p->next;
delete p;
}
}
}
您的代码没有删除任何内容,因为您没有遍历列表。您只是检查第一个元素是否等于键(2),但列表的第一个元素是1。
如果希望删除key ==函数参数key的每个节点,则需要遍历整个列表。
node* current_node{ head };
while (current_node)
{
node* next{ current_node->next };
if (current_node->key == key)
{
// This operation should take care of properly managing pointers
// in the linked list when a node is erased.
erase(current_node);
}
current_node = next;
}
您的代码中有几个问题。如果第一个节点等于'2' -您只删除第一个节点。为什么要为Node *prev
分配内存?你有内存泄漏(见注释)。
你可以试试下面的代码:
void LinkedList::Delete(int key)
{
if (head == 0)
return;
Node* prev = 0;
Node* cur = head;
while (cur != 0)
{
if (cur->data == key)
{
Node* temp = cur;
if (prev == 0)
head = cur->next;
else
prev->next = cur->next;
cur = cur->next;
delete temp;
}
else
{
prev = cur;
cur = cur->next;
}
}
}
我用Turbo c++编译器编写。
//start deleteEnd code
void deleteEnd()
{
if (first == NULL)
{
cout<<"No list Available";
return;
}
next = first;
while (next->add != NULL)
{
cur = next;
next = next->add;
}
cur->add=NULL;
}
//deleteEnd
相关文章:
- 反向给定链表中的K节点
- 我们可以删除链表中静态内存中的节点吗
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- 如何按数字顺序插入链表节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 在C++的链表末尾插入一个节点
- 在解决链表问题时创建一个额外的节点是一个好习惯吗?
- 插入一个基本的单向链表节点似乎破坏了我的 c++ 代码?
- 修改链表主函数代码,用户将在其中输入节点的索引和数据以及正确的消息
- 删除链表中的特定节点
- 在 c++ 中,在链表节点上使用括号有什么意义?
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 删除链表中的节点 - 分段错误
- 使用函数引用指向节点的指针删除链表中的节点?
- 节点链表中的对象
- 虚拟头节点链表
- C++ 删除类似的节点链表
- c++删除节点链表导致程序崩溃
- 排序节点(链表)c++