大致思路:
①找出 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 }