题解 | #牛群的重新排列#
牛群的重新排列
https://www.nowcoder.com/practice/5183605e4ef147a5a1639ceedd447838
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param left int整型
* @param right int整型
* @return ListNode类
*/
//主要是要用临时变量保存开始反转的前一个节点地址和开始反转的地址
ListNode* reverseBetween(ListNode* head, int left, int right) {
// write code here
//合法性检查
if(left<=0&&(left>right)) return head ;
ListNode *vulnode=new ListNode(0);
vulnode->next=head;
//合法性检查
ListNode *prg=vulnode;
int r=right;
while(r--){
prg=prg->next;
if(!prg) return head;
}
//正式开始
ListNode *ppre,*pre,*tem,*ttem;
pre=vulnode;
ppre=pre;
int le=left;
while(le--){
ppre=pre;
pre=pre->next;
cout<<pre->val<<endl;
cout<<"-----"<<endl;
}
tem=pre;
ListNode *cur=pre;
int i=right-left+1;
cout<<i;
//开始反转
while(i--){
ttem=cur->next;
cur->next=pre;
pre=cur;
cur=ttem;
cout<<i;
}
ppre->next=pre;
tem->next=cur;
return vulnode->next;
}
};

