大致思路:
①找出 m - n 段的起始地址
②对被选中部分的端点做值互换(地址不变)
③将(m+1)-(n-1)段用头插法拼接在n+段的开头
④将头插法生成的段 (m+1)+ 拼接在1-m段后面
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
struct ListNode* reverseBetween(struct ListNode* head, int m, int n ) {
struct ListNode *p1,*p2;
struct ListNode *p = head;
int idx = 0;
//分别找第m个节点和第n个节点的地址
while(p!=NULL){
++idx;
if(idx == m){
p1 = p;
}
if(idx == n){
p2 = p;
break;
}
p = p->next;
}
if(p1 == p2)return head; //p1 == p2 , 无需逆置
else {
//被逆置的部分长度至少为2
//交换端点值
int temp = p1->val;
p1->val = p2->val;
p2->val = temp;
//掐掉端点,对p1-p2剩余部分遍历,头插法依次拼接至p4打头的新链表
struct ListNode *p3 = p1->next;
struct ListNode *p4 = p2;
while(p3!=p2){
struct ListNode *r = p3->next;
p3->next = p4;
p4 = p3;
p3 = r;
}
//将头插法生成的新链表拼接至p1后面
p1->next = p4;
return head;
}
// write code here
}

京公网安备 11010502036488号