递归练习题

深入理解递归 - AcWing

链表的定义

头节点

    Node * LinkList_2 = new Node;
    LinkList_2->data=0;
    LinkList_2->next=nullptr;

尾插法

    while(num_1--){
        int data;
        cin>>data;
        Node * node = new Node;
        node->data=data;
        node->next=nullptr;//注意这里要将指针设置为空
        tailer_1->next=node;
        tailer_1=node;
    }
19年华南师大第三题 合并有序链表
#include<bits/stdc++.h>
using namespace std;

struct Node{
    int data;
    Node * next;
};

Node * merge_sort(Node * L1,Node * L2){

    Node * tmp=nullptr;
    if(L1==nullptr){
      tmp=L2;
      return tmp;
    }
    if(L2==nullptr){
        tmp=L1;
        return tmp;
    }

    if(L1->data <= L2->data){
        tmp=L1;
        tmp->next=merge_sort(L1->next,L2);
    }
    else{
         tmp=L2;
        tmp->next=merge_sort(L1,L2->next);
    }
    return tmp;
}

int main(){

    //创建单链表 并对单链表进行插入操作
    Node * LinkList_1 = new Node;//注意分配空间 之前没分配空间一直出错
    LinkList_1->data=0;
    LinkList_1->next=nullptr;

    //用尾插法进行链表插入操作
    Node * tailer_1=LinkList_1;

    cout<<"请输入你要插入链表1的元素个数num1:";
    int num_1;
    cin>>num_1;
    while(num_1--){
        int data;
        cin>>data;
        Node * node = new Node;
        node->data=data;
        node->next=nullptr;//注意这里要将指针设置为空
        tailer_1->next=node;
        tailer_1=node;
    }

    //定义链表2
    Node * LinkList_2 = new Node;
    LinkList_2->data=0;
    LinkList_2->next=nullptr;

    Node * tailer_2=LinkList_2;
    cout<<"请输入你要插入链表2的元素个数num2:";
    int num2;
    cin>>num2;

    while(num2--){
        int data;
        cin>>data;
        Node * node = new Node;
        node->data=data;
        node->next=nullptr;
        tailer_2->next=node;
        tailer_2=node;
    }

    cout<<"链表1为如下:"<<endl;
    for(Node * p = LinkList_1;p->next!=nullptr;p=p->next){
        cout<<p->next->data<<" ";
    }
    cout<<endl;
    cout<<"链表2为如下:"<<endl;
    for(Node * p = LinkList_2;p->next!=nullptr;p=p->next){
        cout<<p->next->data<<" ";
    }
    cout<<endl;

    Node * LinkList_3=merge_sort(LinkList_1->next,LinkList_2->next);

    cout<<"合并后的链表为如下"<<endl;
    for(Node * p=LinkList_3;p!=nullptr;p=p->next)//这里是对当前节点进行输出 判断的应该是p 而不是 p->next
        cout<<p->data<<" ";
}
链表逆置
#include <iostream>
using namespace std;

// 链表节点结构体定义
struct Node {
    int data;
    Node* next;

    // 构造函数
    Node(int d) : data(d), next(nullptr) {}
};

// 链表逆序函数
Node* reverse_list(Node* head) {

   Node * pre=nullptr;
   Node * cur=head->next;
   Node* tmp;

   while(cur!=nullptr)
   {
       tmp=cur->next;
       cur->next=pre;
       pre=cur;
       cur=tmp;
   }

  head->next=pre;
  return head;
}

int main() {
    // 输入链表
    cout << "请输入链表的元素个数:";
    int n;
    cin >> n;

    cout << "请输入链表的元素值:" << endl;
    Node* head = new Node(0); // 创建头节点
    Node* tail = head; // 尾指针指向头节点
    while (n--) {
        int value;
        cin >> value;
        Node* new_node = new Node(value);
        tail->next = new_node;
        tail = new_node;
    }

    // 逆序链表
    head = reverse_list(head);

    for(Node * p=head->next;p!=nullptr;p=p->next)
        cout<<p->data<<" ";

    return 0;
}

#include <iostream>
using namespace std;

// 链表节点结构体定义
struct Node {
    int data;
    Node* next;

    // 构造函数
    Node(int d) : data(d), next(nullptr) {}
};

// 链表逆序函数
//Node* reverse_list(Node* head) {
//
//   Node * pre=nullptr;
//   Node * cur=head->next;
//   Node* tmp;
//
//   while(cur!=nullptr)
//   {
//       tmp=cur->next;
//       cur->next=pre;
//       pre=cur;
//       cur=tmp;
//   }
//
//  head->next=pre;
//  return head;
//}

Node * reverse_list(Node * pre,Node * listnode)
{
    //递归出口
    if(listnode==nullptr)
    {
        return pre;
    }

    //本层处理

    Node * p=listnode->next;
    listnode->next=pre;
    pre=listnode;

    Node * q=reverse_list(pre,p);

    //返回结果

    return q;
}

int main() {
    // 输入链表
    cout << "请输入链表的元素个数:";
    int n;
    cin >> n;

    cout << "请输入链表的元素值:" << endl;
    Node* head = new Node(0); // 创建头节点
    Node* tail = head; // 尾指针指向头节点
    while (n--) {
        int value;
        cin >> value;
        Node* new_node = new Node(value);
        tail->next = new_node;
        tail = new_node;
    }

    // 逆序链表
    Node * pre=nullptr;
    head = reverse_list(pre,head->next);

    for(Node * p=head;p!=nullptr;p=p->next)
        cout<<p->data<<" ";

    return 0;
}
排列问题

92. 递归实现指数型枚举 - AcWing题库

一种全排列 在本层处理部分 该坑所有元素都可以填

一种是组合排列 在本层处理 只有在该元素后面的才可以 因此引入一个pos记录当前元素

前面这道acwing的其实就是组合排列的基础上加了一个数量限制

 对称二叉树 - 力扣(LeetCode)递归

翻转字符

思想:还是要弄清楚递归的目的:1、递归返回值(string)2 递归参数(这个很重要,从那一层递归,然后将不用看那么远,就关注自己当前字符就行 将其他抽象成一个整体 3、就是返回值 本层应该返回什么内容,返回已经处理好的部分

晴问算法 (sunnywhy.com)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值