如何使用递归从链接列表中的最后一个节点删除到该列表中的特定节点

How to delete from the last node in a linked list to a specific node in that list using recursion

本文关键字:列表 节点 节点删除 最后一个 链接 递归 何使用      更新时间:2024-09-23

所以我试图从链表中的特定节点中删除,但问题不是从节点到结束的删除,而是在尝试使用递归时试图从最后一个节点删除到特定节点。

这是我目前拥有的(从节点删除到最后一个节点(


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。如果我不理解这个问题,请告诉我。