link: https://leetcode-cn.com/problems/reverse-linked-list-ii/
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
//思路:head表示需要反转的头节点,pre表示需要反转头节点的前驱节点
//我们需要反转n-m次,我们将head的next节点移动到需要反转链表部分的首部,需要反转链表部分剩余节点依旧保持相对顺序即可
//比如1->2->3->4->5,m=1,n=5
//第一次反转:1(head) 2(next) 3 4 5 反转为 2 1 3 4 5
//第二次反转:2 1(head) 3(next) 4 5 反转为 3 2 1 4 5
//第三次发转:3 2 1(head) 4(next) 5 反转为 4 3 2 1 5
//第四次反转:4 3 2 1(head) 5(next) 反转为 5 4 3 2 1
ListNode* reverseBetween(ListNode* head, int m, int n)
{
if(head == NULL)
{
return head;
}
ListNode dummy(-1);
dummy.next= head;
ListNode *prev = &dummy;
ListNode *cur = NULL;
for(int i = 1;i<m;i++)
{
prev = prev->next;
}
cur = prev->next;
for(int i = m;i < n;i++)
{
ListNode *next = cur->next;//
cur->next = next->next;//cur节点连接next节点之后链表部分,也就是向后移动一位
next->next = prev->next;//next节点移动到需要反转链表部分的首部
prev->next = next;//pre为需要反转头节点的前驱节点
}
return dummy.next;
}
};