Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

时间:2023-03-10 02:29:05
Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

Reverse反转算法

 #include <iostream>

 using namespace std;
//交换的函数
void replaced(int &a,int &b){
int t = a;
a = b;
b = t;
}
//反转
void reversed(int a[],int length){
int left = ;
int right = length - ;
while (left < right) {
replaced(a[left], a[right]);
left++;
right--;
}
}
void output(int a[],int length)
{
for (int i = ; i<length; i++) {
cout << a[i] << " ";
}
}
int main()
{
int a[] = {,,,,,,,,};
output(a, );
cout << endl;
reversed(a, );
output(a, );
}

斐波那契数列

 #include <iostream>

 using namespace std;

 //斐波那契数列
int qiebona(int a)
{
//也可以用if语句
switch (a) {
case :
case :
return a;
break; default:
return qiebona(a-)+qiebona(a-);
break;
}
}
int main()
{
//验证斐波那契函数
cout << qiebona() << endl;
//然后打印前n个数的斐波那契数列
for (int i = ; i <= ; i++) {
cout << qiebona(i) << " ";
}
return ;
}

Reverse反转单链表算法

 #include <iostream>

 using namespace std;
//1首先这个数据节点中只有一个指针作为成员数据,所以这是一个单链表的节点结构
struct node{
int payload;
node* next;
};
//2对于一个长的单链表的操作,我们只能这个长链表的第一个节点或者说是第一个指针指向的节点开始操作
node* reversed(node* first){
//3如果链表为空或者只有一个,那就返回它自己呗
if (first->next == nullptr || first == nullptr) {
return first;
}//4如果有下一个实例,就
//5获取下一个实例
node* second = first -> next;
//这里就是递归,
node* new_head = reversed(second);
/*6 将下一个节点内部指针的方向反转,但是在反转之前,也要获取这下一个节点原来指向的下下个节点,也就是说,在这个操作之前,要在通过下一个节点获取下下一个节点.
假设在前一步加:node* third = second->next;但是这个简单的思路有局限性,当链表很长的时候,后面会重复这个获取下一个节点的过程,这样肯定是不明智的,因为链表的个数不确定,你就不知道要写多少代码,所以最好的办法就是通过递归重复执行前面相同的步骤(即算法)*/
second -> next = first;
first -> next = nullptr;
return new_head;//7由于递归的特性,最后的return返回值会往前传递到最前面
}