- K 个一组翻转链表
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
//定义一个虚拟头节点
ListNode dummy=new ListNode(-1,head);
//定义一个tail节点(指向上一个分组的尾部)
ListNode tail=dummy;
//定义一个hair节点(指向当前分组的头部)
ListNode hair=head;
int count=0;
while(hair!=null){
//每次反转的时候看下剩余长度(tail之后的长度(节点个数))是不是大于等于k(是否能走完k长度)
ListNode node=tail;
for(int i=0;i<k;i++){
node=node.next;
if(node==null){
// System.out.println("长度不够了");
return dummy.next;
}
}
//返回反转前的这一组的尾节点,要串联到上一组的尾节点上
ListNode[] reverse=reverseFunc(hair,k);
tail.next=reverse[0];
hair.next=reverse[1];
tail=hair;
hair= hair.next;
}
return dummy.next;
}
public ListNode[] reverseFunc(ListNode hair,int k){
ListNode pre=new ListNode();
ListNode cur=hair;
for(int i=0;i<k;i++){
//这步很重要,暂存cur指向的下一个节点
ListNode temp=cur.next;
cur.next=pre;
pre=cur;
cur=temp;
}
//返回的pre相当于反转后子序列的新头节点,cur相当于下一组的头节点
return new ListNode[]{pre,cur};
}
}