递归详解
递归解释
什么时候可以使用递归
递归如何使用
递归五要素:
- 参数:随着递归状态发送改变的对象。
- 返回值:根据题意判断返回什么值。
- 终止条件:根据题意判断递归到什么时候停止。
- 本层递归要做什么:根据题意判断本层递归要做什么。
- 递归方向:可能要改变的对象有几个选择。(4,5)常结合。
经典例题
反转链表
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode*re(ListNode*pre,ListNode*cur){//参数:根据题意,指向肯定是发生在两个对象间,一前一后。
if(cur==nullptr)return pre;//终止条件+返回值。
auto tmp=cur->next;//想要更新,要先将本节点的下一个节点保存下来,因为指向改变了下一个节点如果不事先保存就找不到了。
cur->next=pre;//本层递归需要做什么
return re(cur,tmp);//开始递归,参数更新。
}
ListNode* reverseList(ListNode* head) {
//
return re(nullptr,head);
}
};