C++模板链表递归删除元素时出现删除错误节点问题求助
递归删除链表元素问题修复方案
核心错误原因
你的removes删除函数逻辑存在多处错误,导致删除节点错位:
具体bug列表
- 删除节点指向错误:当判断
nodePtr->getNext()->getItem()==target时,你删除的是当前nodePtr(也就是目标节点的前一个节点),而非目标节点本身,这就是你删3实际删2的直接原因。 - 递归参数传递错误:你创建了局部变量
Node<T>*next = nodePtr->getNext(),将这个局部变量传入递归调用,递归中对指针的修改不会同步到原链表的next指针上,递归操作完全失效。 - 未处理头节点匹配的情况:现有逻辑仅判断下一个节点是否匹配,若要删除的元素是链表头节点,完全不会被处理。
- 函数返回值缺失:多处分支没有return语句,属于未定义行为。
- 主函数中链表头指针未初始化:
Node<unsigned>*myList;是野指针,必须初始化为nullptr。 - Node类缺少非const版本的getNext方法,无法直接传递next指针的引用到递归函数中做修改。
修复后的代码
1. Node类新增非const getNext方法
在Node.h的public成员中新增如下代码:
Node<ItemType>*& getNext() { return next; }
2. 修正后的removes函数
template< typename T > bool removes(Node<T>* &nodePtr, T target) { // 递归出口:空节点返回false if(!nodePtr) { return false; } // 若当前节点就是目标节点,直接删除当前节点 if(nodePtr->getItem() == target) { Node<T>* del = nodePtr; nodePtr = nodePtr->getNext(); delete del; return true; } // 递归处理下一个节点,直接传next的引用,修改会同步到原链表 return removes(nodePtr->getNext(), target); }
3. 其他需要修改的点
主函数中头指针初始化修改为:
Node<unsigned>* myList = nullptr;
修正display函数的多余换行问题:
template<class T> void display(Node<T> *curr) { if(curr != nullptr) { cout << curr->getItem() << " "; display(curr->getNext()); } // 仅在遍历结束后输出一次换行 else { cout << endl; } }
内容的提问来源于stack exchange,提问作者kausicmn
相关产品推荐
相关产品推荐

