https://leetcode-cn.com/problems/reverse-linked-list-ii/
思路:首先找到第 m − 1 m-1 m−1个节点设为 p r e pre pre,然后反转 m m m到 n n n的链表,假设第 n + 1 n+1 n+1个节点为 c u r cur cur,由于 p r e − > n e x t pre->next pre−>next最初指向第 m m m个节点,且在反转过程中没有修改它的值,所以在反转结束后 p r e − > n e x t pre->next pre−>next指向第 n n n个节点,那么此时还需要做两步操作: ( 1 ) (1) (1) p r e − > n e x t − > n e x t pre->next->next pre−>next−>next指向 c u r cur cur; ( 2 ) p r e − > n e x t (2)pre->next (2)pre−>next指向第 m m m个节点。
/**
* 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) {
if(!head||m==n)
return head;
ListNode myHead(0);
myHead.next=head;
ListNode *cur=&myHead;
int ct=0;
//先找到第m-1个节点
while(++ct<m)
cur=cur->next;
//pre->next为第m个节点
ListNode *pre=cur;
cur=cur->next;
ListNode *tmp1=nullptr,*tmp2;
--ct;
//反转
while(++ct<=n){
tmp2=cur->next;
cur->next=tmp1;
tmp1=cur;
cur=tmp2;
}
//现在cur为第n+1个节点 pre->next为第n个节点 需要把它们连起来
pre->next->next=cur;
//再修改pre->next为第m个节点
pre->next=tmp1;
return myHead.next;
}
};