递归搜索与回溯算法
反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
解法(递归):
算法思路:
- 递归函数的含义:交给你⼀个链表的头指针,你帮我逆序之后,返回逆序后的头结点;
- 函数体:先把当前结点之后的链表逆序,逆序完之后,把当前结点添加到逆序后的链表后⾯即可;
- 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤逆序,直接返回。
代码如下:
C++
/**
* 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* reverseList(ListNode* head) {
if(head==nullptr||head->next==nullptr)
{
return head;
}
ListNode*newHead=reverseList(head->next);
head->next->next=head;
head->next=nullptr;
return newHead;
}
};
两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
解法(递归):
算法思路:
- 递归函数的含义:交给你⼀个链表,将这个链表两两交换⼀下,然后返回交换后的头结点;
- 函数体:先去处理⼀下第⼆个结点往后的链表,然后再把当前的两个结点交换⼀下,连接上后⾯处 理后的链表;
- 递归出⼝:当前结点为空或者当前只有⼀个结点的时候,不⽤交换,直接返回
代码如下:
C++
/**
* 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* swapPairs(ListNode* head) {
if(head==nullptr||head->next==nullptr)
{
return head;
}
auto tmp=swapPairs(head->next->next);
auto ret=head->next;
head->next->next=head;
head->next=tmp;
return ret;
}
};
POW(X,N)
实现 pow(x , n) ,即计算 x
的整数 n
次幂函数(即,xn
)。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
n
是一个整数- 要么
x
不为零,要么n > 0
。 -104 <= xn <= 104
解法(递归-快速幂):
算法思路:
- 递归函数的含义:求出 x 的 n 次⽅是多少,然后返回;
- 函数体:先求出 x 的 n / 2 次⽅是多少,然后根据 n 的奇偶,得出 x 的 n 次⽅是多少;
- 递归出⼝:当 n 为 0 的时候,返回 1 即可。
代码如下:
C++
class Solution {
public:
double myPow(double x, int n) {
return n<0?1.0/pow(x,-(long long)n):pow(x,n);
}
double pow(double x,long long n)
{
if(n==0) return 1.0;
double tmp=pow(x,n/2);
return n%2==0?tmp*tmp:tmp*tmp*x;
}
};
- 递归函数的含义:求出 x 的 n 次⽅是多少,然后返回;
- 函数体:先求出 x 的 n / 2 次⽅是多少,然后根据 n 的奇偶,得出 x 的 n 次⽅是多少;
- 递归出⼝:当 n 为 0 的时候,返回 1 即可。
代码如下:
C++
class Solution {
public:
double myPow(double x, int n) {
return n<0?1.0/pow(x,-(long long)n):pow(x,n);
}
double pow(double x,long long n)
{
if(n==0) return 1.0;
double tmp=pow(x,n/2);
return n%2==0?tmp*tmp:tmp*tmp*x;
}
};