【问题标题】:How to delete from the last node in a linked list to a specific node in that list using recursion如何使用递归从链表中的最后一个节点删除到该列表中的特定节点
【发布时间】:2021-02-24 21:03:30
【问题描述】:

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

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


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

标签: c++ recursion linked-list


【解决方案1】:

您的问题的答案是简单地在调用delete 之前执行递归调用之前

但是,即使您能够顺利删除指定的节点,您提供的代码仍然存在一个重大缺陷——它不会更新节点的next 字段之前指定的节点,因此您最终会使列表处于无效状态,因为该 prior 节点将成为新的尾节点,但具有不会终止列表的非空 next 指针正确。

对于单链表,您必须从列表的前面进行迭代才能发现要更新的 prior 节点。但是一旦你到达指定的节点,并且知道它的 previous 节点,那么你可以对列表的其余部分使用递归算法,例如:

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;
    }
}

Live Demo

话虽如此,双链表更适合这个任务,因为你根本不需要从列表的前面迭代,你可以从指定的节点开始,例如:

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;
}

Live Demo

【讨论】:

    【解决方案2】:

    如果我理解正确,您想删除指向您的特定节点的节点。如果我这样做,我将有 2 个节点,currentNode 和 prevNode。当你向前迭代时,你会移动它们,当 currentNode 符合规范时,你可以删除 prevNode。如果我没有正确理解问题,请告诉我。

    【讨论】:

    • 我想从列表中的最后一个节点向后删除到参数节点,所以假设 1,2,3,4,5,6,7 在列表中,5 是参数节点那么 7 , 6 ,5 应该按这个顺序删除
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多