92 reverse-linked-list-ii
题目:
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
思路
简单一点的 反转整个链表 的递归思路如下:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
if(head == nullptr || head->next == nullptr)
return head;
ListNode* p = reverseList(head->next);
head->next->next = head;
head->next = nullptr;
return p;
}
};
1)反转1-n个节点则需要将当前反转的第一个节点与第n+1节点相连,记录n+1个节点,在递归结束的时候更新状态,即reverseN函数。返回1-n节点中的新的头结点,即第n个节点。
2)主逻辑是,当m=1的时候,即为反转1-n节点;m!=1时,则继续往下处理(反转m-1到n-1个节点)。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* last = nullptr;
ListNode* reverseN(ListNode* head, int n)
{
if(head==nullptr || head->next == nullptr)
return head;
if(n==1)
{
last = head->next;
return head;
}
ListNode* p = reverseN(head->next, n-1);
head->next->next = head;
head->next = last;
return p;
}
ListNode* reverseBetween(ListNode* head, int m, int n) {
if(m==1)
{
head = reverseN(head, n);
}
else
{
head->next = reverseBetween(head->next, m-1, n-1);
}
return head;
}
};