先局部反转,再将其与其他部分连接,非常的麻烦!
/**
* struct ListNode {* int val;
* struct ListNode *next;
* };
*
* C语言声明定义全局变量请加上static,防止重复定义
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
if(!head||!head->next)
return head;
if(m==n)
return head;
struct ListNode* p1=head,*p2=head,*p0=head,*pm=head;
//找到要反转的头尾两个节点
for(int i=1;i<m;i++){
p0=p1;
p1=p1->next;
pm=p1;
}
for(int j=1;j<n;j++){
p2=p2->next;
}
//反转,利用p1,p3,p4三个指针
struct ListNode*p3=p1->next,*p4=p1->next->next;
while(p1!=p2){
p3->next=p1;
p1=p3;
p3=p4;
if(p4)
p4=p4->next;
}
//将反转后的部分链表与首尾连接
p0->next=p1;
pm->next=p3;
//特殊情况,直接返回p2
if(m==1)
return p2;
return head;
}