反转链表请参考前一篇文章。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
// 这里以输入为 [1,2,3,4,5] left = 2 ,right = 4为例。
// 本题另外注意的是利用了分治的思想,把大问题变成小问题来求解,(直到翻转区间中的链表不简单,可以先令left = 0;(这里需要控制的条件是把右边区间外的最一个结点(1)指向区间中的最后一个结点(4)(代码中①位置的表示))这样就变成了反转前n项的链表反转问题,再接着缩小问题规模,即在令right = 0;(这里需要控制的条件是区间中的第一个结点(2)指向右边区间外的第一个结点(5),(代码中②③位置的表示)这样就变成了最基本的链表反转问题。
struct ListNode *temp = NULL; //新定义一个指针用于保存结点(5) ②
struct ListNode* reverse(struct ListNode* head , int n)
{
//struct ListNode *temp = NULL; //递归函数中不能定义变量。
if(n == 1){
temp = head->next; // ③
return head;
}
struct ListNode *last = reverse(head->next,n-1);
head->next->next = head;
head->next = temp;
return last;
}
struct ListNode* reverseBetween(struct ListNode* head, int left, int right){
if(left == 1) return reverse(head,right);
head->next = reverseBetween(head->next,left-1,right-1); //①
return head;
}