1 递归解法
1.1 代码展示
先看看代码尝试自行理解
ListNode* succ=NULL;//记录后继,要放在reverseN外面。
//递归 反转链表前n个元素
ListNode* reverseN(ListNode* head,int n){
if(n==1){
succ=head->next;
return head;
}
ListNode* last=reverseN(head->next,n-1);
head->next->next=head;
head->next=succ;
return last;
}
//区间反转递归
ListNode* reverseBetween(ListNode* head, int left, int right) {
//解法1:递归
if(left==1){
return reverseN(head,right);
}
head->next=reverseBetween(head->next,left-1,right-1);
return head; }
浅浅解释一下
1.2 区间反转递归
假设链表为[1,2,3,4,5,6]六个节点,我们需要反转区间[2,4]
ListNode* reverseBetween(ListNode* head, int left, int right)
往深一层递归后
reverseBetween(head->next, left-1, right-1)
结果如下:
此时需要做的,就是让1指向4,再返回1;
即:
head->next=reverseBetween(head->next, left-1, right-1);
return head;
这也就是区间递归的一般情况
再往深一层递归,不难发现left=1,问题已经脱离了一般情况,变成了反转链表前n个元素。
1.3 前n个元素反转递归
假设[2,3,4,5,6]五个节点,需要反转前3个元素
ListNode* reverseN