考虑像 1->2->3->4->5 这样的列表
Tlist 的制作方式如下:
typedef struct node{
int info;
struct node *link;
}Tnode;
typedef Tnode *Tlist;
我得到了像这样构建的函数 listDeleteOdd
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;
};
删除节点只是释放给定节点 ofc 的内存。 顺便说一句,我不明白第二个 if 之后的值 Tnode *node 如何变化。就像它应该是 NULL 一样,因为当原型(prototype)“列表”到达末尾时,循环返回 NULL。循环到达末尾后,节点和“返回列表”末尾会发生什么?它返回什么?
几个月前我研究了递归,现在一切都很困惑。有人可以向我解释整个功能如何正常工作,因为我有点理解它是如何工作的,但我认为有些步骤我心里不太清楚。提前感谢患者。
最佳答案
关键是定义 listDeleteOdd()
的作用。它返回一个指向节点列表的指针,该列表要么为空,要么只包含偶数值——一个“干净列表”。
在内部,它通过三种不同的操作来实现这一点:
- 输入列表为空(NULL);返回 NULL(基本情况)。
- 列表中的第一个节点是奇数;捕获下一个节点,删除当前节点;递归以返回从下一个节点开始的干净列表。
- 通过消除,列表中的第一个节点是偶数。捕获从下一个节点开始的偶数值列表(递归)。使当前节点的下一个指针 (
link
) 指向干净列表,并返回当前节点作为(现在干净的)列表的开头。
关于c - 链接列表递归函数,从列表中删除奇数值。 (C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59953206/