25.k个一组翻转链表
难度:困难
标签:链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例:
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明:
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
public ListNode reverseKGroup(ListNode head, int k) {
if(head==null||head.next==null) return head;
ListNode Head=new ListNode(-1);
Head.next=head;
int cnt=1;
boolean flag=false;
ListNode p=null;
ListNode q=head.next;
ListNode tmp=head;
ListNode H=head;
while(count(Head.next,k)){
//每k个结点的第一个结点,翻转之后变成每k个最后一个结点,需要保存下来,用来和后面的数据链上
tmp=Head.next;
//从每k个结点中的第二个开始
q=tmp.next;
for(int i=1;i<k;i++){
//p是头插的结点
p=q;
//保存下一个结点
q=p.next;
//头插
p.next=Head.next;
Head.next=p;
}
if(cnt==1){
//保存整个链表的第一个结点
H=p;
cnt++;
}
//修改头结点,指向下k个结点之前的结点,就是翻转前的第一个结点,就是保存的tmp
Head=tmp;
//头结点,链上链表上剩下的结点。
Head.next=q;
}
return H;
}
boolean count(ListNode head,int k){
//判断是否有k个结点
int i=0;
ListNode p=head;
while(p!=null&&i<k){
p=p.next;
i++;
}
if(i==k) return true;
else return false;
}