当前位置: 首页 > 知识库问答 >
问题:

递归地从链表中删除节点

松涵容
2023-03-14

给定一个链表和一个指定的数据值,我想递归地删除包含所述数据的所有节点。(我已经找到了迭代的方法,但我想这样做)。我已将我的结构定义为:

struct Node{
  int data;
  Node *next;
};
struct LinkedList{
  Node *head;
};

为了删除,我做了这个助手函数,它(应该)返回指向我删除列表的头节点的指针:

Node* deleteNodeRecursivelyHelper(Node *head, int value){
  if (head==NULL){
    return 0;
  }
  if (head->data==value){
    head=head->next;
    deleteNodeRecursivelyHelper(head,value);
    return 0;
  } else{
    Node *x=head;
    deleteNodeRecursivelyHelper(head->next,value);
    return x;
  }
}

然后我想在我的实际列表中使用它:

void deleteNodeRecursively(LinkedList* list, int value){
  if (list->head==NULL){
    return;
  } else if (list->head->data==value){
    list->head=list->head->next;
    deleteNodeRecursively(list,value);
   } else{
    deleteNodeRecursivelyHelper(list->head->next,value);
  }
}

但这不起作用。看起来我的助手函数实际上不起作用,但我无法理解。出什么事了?

共有1个答案

佴英奕
2023-03-14

你可能想要:

Node* deleteNodeRecursivelyHelper(Node* head, int value){
    if (head == nullptr) {
        return nullptr;
    }
    if (head->data == value) {
        auto next = head->next;
        delete head; // I assume that you allocate node.
        return deleteNodeRecursivelyHelper(next, value);
    } else {
        head->next = deleteNodeRecursivelyHelper(head->next, value);
        return head;
    }
}

void deleteNodeRecursively(LinkedList* list, int value){
    list->head = deleteNodeRecursivelyHelper(list->head, value);
}
 类似资料:
  • 我有一个链表定义为 我希望递归地遍历我的链表,删除具有指定数据类型的节点(并正确地重新加入节点)。我找到了迭代的方法,但我一直在努力递归。到目前为止,我得到的是: 基本上,我的策略是确定头部是否有数据。如果是这样,我就用下一个节点替换头部。问题是else语句,我知道我必须“移动”到下一个节点。我不仅要转到下一个节点,还要确保它是LinkedList格式的,这样我才能正确使用头部。我不知道如何在不删

  • 所以我有一个链接列表,我希望能够删除一个数字的第一次出现, 我正在尝试使用递归,但不幸的是,我最终只能删除列表的头部 我有三个不同的类,一个用于末尾的空列表,另一个类声明这个方法和实际的列表。

  • 我正在学习数据结构,并试图理解Java中的链接列表。我的问题是,我有麻烦与删除节点在给定的索引递归。我的目标是得到O(log n),而不是使用循环,最后得到O(n)。 因此,当我试图删除索引2的条目时,它会删除该索引之前的所有数字,但不会删除该索引-因此它会删除[0]和[1],但不会删除[2]。 例如,在此代码中,删除前的数组填充为:。调用后,它有以下条目: 我只想删除13,这样数组就会像这样:

  • 几个月前我学习了递归,现在这一切都很混乱。有一个人可以解释我整个功能是如何正常工作的,但我有点明白它是如何工作的,但我认为有些步骤在我的脑海中并不是很清楚。病人的Thx提前。

  • 我试图从基于阉羊的双链表中删除一个元素,该列表中的节点满足返回bool的函数。由于某种原因,替换节点的前一个指针(下一个被删除)不更新,而是引用回它自己。 我的代码 测试结果

  • 我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)