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

链表递归函数,从列表中删除奇数值。(C)

贺元明
2023-03-14
typedef struct node{
    int info;
    struct node *link;
}Tnode;

typedef Tnode *Tlist;
Tlist listDeleteOdd(Tlist list) {  

    if (list == NULL) 
        return NULL;

    if (list->info % 2 == 1) {
        Tnode *node = list->link;
        DeleteNode(list);
        return listDeleteOdd(node);
    }
    Tnode *node = listDeleteOdd(list->link);
    list->link = node;
    return list;
};

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

共有1个答案

邢承弼
2023-03-14

关键是定义listdeleteodd()所做的事情。它返回一个指向一个节点列表的指针,该列表要么是空的,要么只包含偶数值--一个“干净的列表”。

在内部,它通过三种不同的操作来实现:

  1. 输入列表为空(NULL);返回NULL(基本大小写)。
  2. 列表中的第一个节点为奇数;捕获下一个节点,删除当前节点;递归返回从下一个节点开始的清洁列表。
  3. 通过消元,列表中的第一个节点为偶数。捕获从下一个节点开始的偶数值列表(recurse)。使当前节点的下一个指针(link)指向清洁列表,并返回当前节点作为(现在清洁)列表的开始。
 类似资料:
  • 我有一个链表定义为 我希望递归地遍历我的链表,删除具有指定数据类型的节点(并正确地重新加入节点)。我找到了迭代的方法,但我一直在努力递归。到目前为止,我得到的是: 基本上,我的策略是确定头部是否有数据。如果是这样,我就用下一个节点替换头部。问题是else语句,我知道我必须“移动”到下一个节点。我不仅要转到下一个节点,还要确保它是LinkedList格式的,这样我才能正确使用头部。我不知道如何在不删

  • 给定一个链表和一个指定的数据值,我想递归地删除包含所述数据的所有节点。(我已经找到了迭代的方法,但我想这样做)。我已将我的结构定义为: 为了删除,我做了这个助手函数,它(应该)返回指向我删除列表的头节点的指针: 然后我想在我的实际列表中使用它: 但这不起作用。看起来我的助手函数实际上不起作用,但我无法理解。出什么事了?

  • 我试图从ArrayList中删除所有奇数,并且它必须是for或Fore每循环。循环结束后,ArrayList中剩余的数字的结果将7, 90, 55, 60。当我设定一个条件时: 一切工作正常。所有偶数都被删除,但在第一个示例中,奇数的情况并非如此。为什么会发生这种情况?

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

  • 我需要返回带有删除的所有重复元素的链表的头部。我理解这个问题的逻辑,但我在使用递归时变得困惑。 如果我在If条件之前调用函数RemoveDuplicates(head.next);很好用。但是,如果我交换语句的顺序(rest所有内容都完全相同),如下所示: 代码无法正确解决像'1->1->1->1'这样的测试用例。在后一种情况下,我得到的输出是'1->1'。 我真的想要一些关于我如何更好地理解递归

  • 我想递归地删除一个链表。我想到了如何迭代地做到这一点,但我对如何做到这一点很好奇。到目前为止我有: 我定义的地方 如果需要,我可以去掉头部,但我不知道如何去掉身体或尾巴,然后正确地缝合列表,更不用说递归地做了。我该如何进行?为什么这样不行? 编辑:删除问号并替换为我认为可行的代码。