

java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
ListNode end = dummy;
while(end.next != null){
//将end指针移动k步找到本组的尾
for(int i = 0; i < k && end != null; i++){
end = end.next;
}
if(end == null) break;
//将本组与后面进行切割
ListNode start = prev.next;
ListNode nextGroup = end.next;
end.next = null;
//进行局部翻转
prev.next = reverseList(start);
//将反转后的节点与后续连接起来
start.next = nextGroup;
//为下组做准备
prev = start;
end = prev;
}
return dummy.next;
}
//翻转链表
private ListNode reverseList(ListNode head){
ListNode prev = null;
ListNode curr = head;
while(curr != null){
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
}
设置prev和end节点为当前要翻转组的前驱节点和最后节点
设置start和nextGroup节点,用于切割待翻转节点组和连接后续节点。
写一个反转链表的函数进行调用
最后prev和end节点移动到第二组需要翻转的节点组