如何使用递归从链接列表中的最后一个节点删除到该列表中的特定节点
How to delete from the last node in a linked list to a specific node in that list using recursion
所以我试图从链表中的特定节点中删除,但问题不是从节点到结束的删除,而是在尝试使用递归时试图从最后一个节点删除到特定节点。
这是我目前拥有的(从节点删除到最后一个节点(
void rLL<T> :: recursiveDelete(item<T> * node)
{
if (node != nullptr)
{
item<T> * nodeptr = node -> next;
delete node;
size--;
recursiveDelete(nodeptr);
}
}
现在我必须试着改变它。我不知道该怎么做。这是一个学校项目,所以如果可能的话,请尽量保持简单。
编辑:假设列表由1,2,3,4,5,6,7组成,节点5被放在参数节点中,然后7,6,5应该按照特定的顺序删除(稍微清理一下(
问题的答案是在调用delete
之前简单地执行递归调用。
然而,即使您能够删除指定的节点而不失败,您提供的代码仍然会有一个主要缺陷——它不会在指定节点之前更新节点的next
字段,因此您最终会使列表处于无效状态,因为先前的节点将成为新的尾部节点,但具有未正确终止列表的非空next
指针。
对于单个链接列表,您必须从列表的前面进行迭代,才能发现要更新的前节点。但是,一旦你到达指定的节点,并知道它的前一个节点,那么你就可以对列表的其余部分使用递归算法,例如:
template<typename T>
void rLL<T>::recursiveDelete(item<T> *node, item<T> *previous)
{
if (!node) return;
recursiveDelete(node->next, node);
if (previous) previous->next = nullptr;
--size;
delete node;
}
void rLL<T>::deleteToEnd(item<T> *startNode)
{
if (!startNode) return;
item<T> *node = head;
item<T> *previous = nullptr;
while (node)
{
if (node == startNode)
{
recursiveDelete(node, previous);
return;
}
previous = node;
node = node->next;
}
}
实时演示
也就是说,一个双链接列表更适合这个任务,因为你根本不需要从列表的前面迭代,你可以从指定的节点开始,例如:
void rLL<T>::deleteToEnd(item<T> *startNode)
{
if (!startNode) return;
deleteToEnd(startNode->next);
item<T> *previous = startNode->previous;
if (previous) previous->next = nullptr;
if (head == startNode) head = nullptr;
tail = previous;
--size;
delete startNode;
}
实时演示
如果我理解正确,您需要删除指向特定节点的节点。如果我这样做,我会有两个节点,currentNode和prevNode。当你向前迭代时,你会移动它们,当currentNode满足规范时,你可以删除prevNode。如果我不理解这个问题,请告诉我。
相关文章:
- C 指针节点帮助 - 将参数复制到链接的列表节点更改该节点的不同部分
- 是否可以将新的列表节点分配给链表的现有节点
- 我如何不调用位于链接列表节点中的对象的构造函数
- 链接列表节点的访问违规:C
- 将指针分配给链接列表节点会引发"Segmentation Fault"
- C 链接列表节点与类
- 错误 - 列表节点未命名类型
- 在模板类列表/节点程序中获取错误
- 如何为链接列表节点定义一个以指针为模板类型的模板类
- 链接列表节点的RAII样式C++类
- 存储链接列表节点地址
- 泛型列表节点类中出错
- 获取列表<节点*>中的字符并返回
- 错误 C2440:"=":无法从"列表节点 *"<T>转换为"列表节点<T> *"
- 通过池分配器中的内存地址访问可用列表节点时出现问题
- 无法在赋值中将"列表节点**"转换为"列表节点*"
- c++ STL列表节点内存分配中的段错误
- vector std::out_of_range 在我自己的模板类中(指向列表节点的指针向量),但我不明白为什么
- 列表节点指针"未在此范围内声明"?
- GCC 列表节点交换实现过于复杂