Leetcode_206.反转链表(递归)

这道题原本的方式是采用头插法来解决,现在有了一个新的思路,那就是递归

在设计递归时需要着重考虑的就是递归的终止条件,那么我们这个题的终止条件是什么呢?

在链表为空,或者链表为1个节点时,链表不需要反转,以此可以作为递归的终止条件,即:
head == nullptr || head->next == nullptr

结束条件有了,下来该写递归函数了。在没有达到终止条件时,应该反转链表,通过总体来看,当第一次反转时,应该反转 head->next 之后的链表,因为终止条件为 head == nullptr || head->next == nullptr,所以递归调用参数应该是 head->next,这样才能让递归逐步向链表尾部推进,直到触发终止条件。然后在回溯过程中,通过 head->next->next = head 来反转指针方向,完成整个链表的反转。

整个递归过程是从后向前的,在处理 1 节点是 , 链表已经变为了 5 -> 4 -> 3 -> 2 ->nullptr ,此时回溯就需要将2指向1 ,1指向nullptr,那么 2 这个节点的地址该如何获取呢?

可以在进行递归之前先获取这个节点的地址 ListNode * tail=head->next,由此获取节点2的地址,回到上面 就变为 1->next=tail->next(nullptr) ;2->next =1;,翻译一下也就是 head->next =tail->next; tail->next =head ;

ac代码:

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* reverseList(ListNode* head) {
        if(head==nullptr||head->next==nullptr) return head;
        ListNode *tail=head->next;
        ListNode * new_head=reverseList(head->next);
        head->next=tail->next;
        tail->next=head;
        return new_head;

    }
};
相关推荐
草莓熊Lotso17 小时前
《算法闯关指南:优选算法--滑动窗口》--14找到字符串中所有字母异位词
java·linux·开发语言·c++·算法·java-ee
hhhhhshiyishi17 小时前
WLB公司内推|招联金融2026届校招|18薪
java·算法·机器学习·金融·求职招聘
MATLAB代码顾问17 小时前
Python实现手榴弹爆炸算法(Grenade Explosion Method, GEM)(附完整代码)
开发语言·python·算法
SuperCandyXu18 小时前
P2168 [NOI2015] 荷马史诗-提高+/省选-
数据结构·c++·算法·洛谷
无损去水印精灵18 小时前
抖音视频图片如何去水印?去水印工具分享
经验分享·笔记·算法·音视频
wewe_daisy18 小时前
矩阵、线性代数
线性代数·算法·矩阵
报错小能手18 小时前
新手向 算法 基数排序-yang
数据结构·算法·排序算法
lingran__18 小时前
速通ACM省铜第十四天 赋源码(Coloring Game)
c++·算法
lxmyzzs18 小时前
【图像算法 - 28】基于YOLO与PyQt5的多路智能目标检测系统设计与实现
人工智能·算法·yolo·目标检测
咸鱼爱学习20 小时前
【题解】 [蓝桥杯 2019 省 B] 特别数的和
算法·职场和发展·蓝桥杯·模拟·枚举