/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
int change_len = n-m+1;
//记录该节点的前驱节点
ListNode *pre_head = NULL;
//记录一开始的节点
ListNode *result = head;
while(head&&--m){
//移动后的当前节点的前驱节点
pre_head=head;
head=head->next;
}
//记录该点的当前节点(开始逆序的节点)
ListNode *modify_list_tail=head;
ListNode *new_head=NULL;
//逆序
while(head && change_len){
ListNode *next=head->next;
head->next=new_head;
new_head=head;
head=next;
change_len--;
}
//逆序后尾节点 指向 后继节点
modify_list_tail->next=head;
//非空代表不是从第一个节点开始逆序的,所以要将前驱节点指向new_head
if(pre_head){
pre_head->next=new_head;
}else{
result=new_head;
}
return result;
}
};