个人做题学习笔记
方法一:迭代
/**
* 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新的头结点。
在此理解的基础上,尝试使用递归。
小萌新个人刷题总结,欢迎大佬批评指正。