package leetCode;
/**
* @author 真他喵的学不动咯
* @create 2022-08-11--20:06
*/
public class resverse { //分段反转序列,然后连接起来
public class ListNode{
//属性
ListNode next;
ListNode last;
//构造器
public ListNode(){
}
}
//把数据分段
public static ListNode getGroupEnd(ListNode start,int k){
while (--k!=0 && start!=null){
//--k!=0如果没数够k个数
//start!=null是说,现在不是没数够k个数的情况,即长度足够
//如果长度不够k个就返回空
start =start.next; //向下跳
}
return start;
}
//反转
public static void reverse(ListNode start,ListNode end){
end=end.next;
ListNode pre=null;
ListNode next=null;
ListNode cur=start; //start表示这一小段数据中的第一个元素
if (cur!=end){
next=cur.next; //先用next记下下一个位置
cur.next=pre; //cur的下一个是上一个
pre=cur;
cur=next; //
}
start.next=end;
}
public static ListNode reverseKGroup(ListNode head,int k){
ListNode start=head; //定义头
ListNode end=getGroupEnd(start,k); //定义尾
if (end==null){ //如果第一组数据就不足够,那就返回第一个头部
return head;
}
//如果没返回,则第一组数据已凑齐
//因为正好要逆序,所以把end直接赋给head
head=end;
reverse(start,end); //把小段逆序
//定义上一组的结尾结点lastEnd
ListNode lastEnd=start;
if(lastEnd!=null){ //如果上一段的结尾结点不是null
start=lastEnd.next; //通过重新定义start,把段和段之间,用lastEnd连起来
end=getGroupEnd(start,k); //重新定义start和end
if (end==null){
return head;
}
//此时end不是空
reverse(start,end);
lastEnd.next=end; //重新更新lastEnd连接到 到第二段的start【逆序以后的】
lastEnd=start; //lastEnd变成第二段的start【正序的end,也就是逆序以后的start】
}
//能跑到这里,说明正好争端段长度是k的整数倍
return head; //最后要返回头,这样从能从头到尾完整!
}
}
//分段反转序列,然后连接起来
最新推荐文章于 2024-06-05 21:00:00 发布