0.题目
Given the head of a singly linked list and two integers left and right where left <= right, reverse the nodes of the list from position left to position right, and return the reversed list.
Example 1:
Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]
Example 2:
Input: head = [5], left = 1, right = 1
Output: [5]
Constraints:
The number of nodes in the list is n.
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n
1.递归反转整个链表
递归返回后,head的nextt仍指向反转链表末尾,修改末尾指针即可,而反转链表头部则从递归最深层逐渐传递出去。
2.反转链表前 N 个节点
需记录最后一个反转点的下一个结点,作为头部的接点
special case:反转所有节点,此时下一个结点为NULL
3. 反转链表的一部分
只需逐步向前迭代,到达需反转的起点,即可调用2的反转链表前 N 个节点方法
4. 代码
/**
* 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* last=NULL;
ListNode* keep=NULL;
ListNode* reverseN(ListNode* head,int num)
{
//只需反转其本身
if(num==1)
{
keep=head->next;
return head;
}
last=reverseN(head->next,num-1);
head->next->next=head;
head->next=keep;
return last;
}
ListNode* start=NULL;
ListNode* reverseBetween(ListNode* head, int left, int right)
{
if(left==1)
{
return reverseN(head,right);
}
else
{
head->next=reverseBetween(head->next,left-1,right-1);
return head;
}
}
};
参考链接: link.