从链表中删除节点
Delete node from Linked List
我正在研究从链表中删除节点的迭代删除函数,我认为代码应该可以正常工作,它遍历列表,找到所需的节点,将头指向下一个节点并删除当前节点,但是当我测试运行它时,我得到了无限循环,您能否帮助我查明错误, 这是函数:
typedef struct E_Type * List;
struct E_Type
{
int data;
struct E_Type* next;
};
函数:
bool erase(List & l, int data){
List head = l;
if (l != 0){
for(List current = head; current; current = current->next){
if ( current->data == data )
head = current->next;
delete current;
return true;
}
}
return false;
}
测试程序:
int main()
{
List l = 0;
cout << boolalpha << l->data << "went well? "<< (insert(l,73)) << endl;
cout << boolalpha << l->data << "went well? "<< (insert(l,24)) << endl;
print(cout,l);
cout << boolalpha << "Is deleted 24? "<<(erase(l,24)) << endl;
cout << boolalpha << "Is deleted 35? "<<(erase(l,35)) << endl;
print(cout,l);
cout << endl;
return 0;
}
插入:
bool insert(List & l, int data)
{
List current = l;
while(current != 0) {
if (current->data == data)
return false;
current = current->next;
}
if (l == 0 || l->data > data){
List new_list = new E_Type;
new_list->data = data;
new_list->next = l;
l = new_list;
return true;
}
else if(l->data < data){
insert(l->next, data);
return true;
}
}
正如Andreas Brinck已经指出的那样,您还需要更新"上一个"链接。但是,您不需要专用变量,只需使用指向指针的指针:
bool erase(List & l, int data){
List *it = &l;
while ( *it ) {
if ( (*it)->data == data ) {
List next = (*it)->next;
delete *it;
*it = next;
return true;
}
it = &(*it)->next;
}
return false;
}
这还负责处理所有"特殊情况",例如从空列表中删除、删除列表中的第一个元素或删除列表中的最后一个元素。
您还需要在 for 循环中跟踪前一个节点,并执行以下操作:
prev->next = current->next;
delete current;
您还需要处理已删除元素是列表的第一个元素的情况,在这种情况下,您需要将l
设置为 l->next
bool erase(List & l, int data){
if (l != 0){
for(List current = head, prev = 0; current; prev = current, current = current->next){
if ( current->data == data )
{
if (prev)
{
prev->next = current->next;
}
else
{
l = current->next;
}
delete current;
return true;
}
}
return false;
}
您的第一次擦除可能正在创建一个循环列表。
我们可能还需要查看您的插入方法。
有没有可能
current == current->next
如果是这样,可能会导致无限循环。
相关文章:
- 为什么我的删除节点函数实际上没有删除节点?
- 我们可以删除链表中静态内存中的节点吗
- 为什么"delete"关键字不删除节点?
- 为什么我的双向链表删除函数会删除多个节点?
- 编写一个函数来删除单链表中的节点(尾部除外),仅授予对该节点的访问权限
- 删除 XML 文件中的子节点C++
- 创建了一个链表,但如何删除 c++ 中的"所有"节点
- 从unordered_map中删除单个节点
- 删除链表中的特定节点
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 删除链表中的节点 - 分段错误
- 删除链接列表中剩余的最后一个节点
- 避免在使用链接列表从 deque 中删除最后一个节点时出现内存泄漏
- 使用函数引用指向节点的指针删除链表中的节点?
- 双向链表 - 无法删除第一个节点
- 双向链表 std::unique_ptr 类在节点删除时无法按预期工作
- BST 节点删除 - 指针未正确删除
- 节点删除功能的链表问题
- 布尔函数始终为真,单向链表中的尾节点删除创建无限循环
- AVL树中节点删除值异常