
🔥近津薪荼:个人主页
🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》《Linux操作系统及网络基础知识分享》《近津薪荼的算法日迹》
✨体验生活,而不是演绎完美
1.上期参考代码
cpp
/**
* 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* mergeTwoLists(ListNode* l1, ListNode* l2) {
if(l1==nullptr)return l2;
if(l2==nullptr)return l1;
if(l1->val<=l2->val)
{
l1->next=mergeTwoLists(l1->next, l2);
return l1;
}else
{
l2->next=mergeTwoLists(l1, l2->next);
return l2;
}
}
};
2.本期知识点导图

3.本期要讲解的题目是:
反转链表

要点:
迭代与递归两种方法
本期的题目超级简单 ,主要是在让大家感受一下,递归的宏观写法和具体写法之间微妙的联系。
大家可以尝试自己先用递归写写看

4.解题
4.1迭代法:
cpp
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;
while (curr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}
return prev;
}
};
4.2递归
4.2.1宏观视角(把递归函数看成f)
重复子问题:反转链表
子问题具体需要解决什么:将已知的传来的头节点尾插到反转好的链表中(将head->next
扔给f,就不管了,只需要处理一个头结点的指向)
出口:head==nullptr(传来的时候就是空链表)或者head->next==nullptr

4.2.2具体视角
我们可以把链表看成特殊的树来看
(上一期也提到了递归与树的遍历逻辑的相似性),对树进行后序遍历(bfs),虽然处理方式相同,但要考虑所有节点的处理方式

大家自己动手写写代码,会发现两种视角写出来的代码是一模一样的,神奇不

5.下期要讲解的题目是:
两两交换链表中的节点
这题也非常简单,尝试做一做
