题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* }
*/
public class Solution {
/**
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
// write code here
if (k == 1) return head;
ListNode start = new ListNode(-1);
start.next = head;
ListNode ll,lr,rl,rr;//【lr,rl】闭区间
ll=rl=start;//ll,rl尤其重要,在链表操作中
//循环反转
while(rl!=null){
//找到rl
for(int i=0;i<k&&rl!=null;i++)
rl=rl.next;
if(rl==null)//为空,则不满足k长度,无需操作
break;
//定位rr,lr
rr=rl.next;lr=ll.next;
//断开
rl.next=null;
//反转,并头部拼接上ll
ll.next=reverse(lr);
//尾部拼接
lr.next=rr;
//ll,rl重置
// ll lr ... rl rr
// ll rl ... lr rr
ll=rl=lr;
}
return start.next;
}
private ListNode reverse(ListNode head){
ListNode newHead=null,p=head,q=null;
while(p!=null){
q=p.next;
p.next=newHead;
newHead=p;
p=q;
}
return newHead;
}
}