leetcode 个人刷题反思总结 206. 反转链表(对递归的初步理解)

个人做题学习笔记

方法一:迭代

/**
 * 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) {
        ListNode *p1=head;
        if(p1==nullptr||p1->next==nullptr)   
            return head;
        ListNode *p2=p1->next,*p22=p1->next;
        p1->next=nullptr;
        while(p2!=nullptr)
        {
            p2=p2->next;
            p22->next=p1;
            p1=p22;
            p22=p2;
        }
        return p1;
    }
};

通过参考其他大佬的答案,可以对上述代码进行简化,使代码更加清晰

/**
 * 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) {
        ListNode *curr=head;
        ListNode *prev=nullptr;
        while(curr)
        {
            ListNode *next=curr->next;
            curr->next=prev;
            prev=curr;
            curr=next;
        }
        return prev;
    }
};

方法二:递归

/**
 * 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);//关键代码and递归位置
        head->next->next=head;
        head->next=nullptr;
        return newhead;//return
    }
};

对递归的思考:
一直对递归不是很理解,通过这道题进行一下初步理解:
递归函数最重要的四个内容:
1.关键代码,及函数主要的执行过程。
2.递归位置,即在哪里调用递归函数。
3.结束条件,主要形式是:if(……);return ……;即告诉函数往里递归到什么程度就可以结束递归开始不断返回值。在void类型的函数中可能相对隐晦。如没有结束条件会造成程序永无止尽的调用函数,无法正常运行。
4.return了什么,及要递归的这个函数到底在干什么并最终返回了什么。以本题为例,此函数的作用是将链表倒置,并return新的头结点。
在此理解的基础上,尝试使用递归。

小萌新个人刷题总结,欢迎大佬批评指正。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值