题解 | #链表中的节点每k个一组翻转#
链表中的节点每k个一组翻转
https://www.nowcoder.com/practice/b49c3dc907814e9bbfa8437c251b028e
import java.util.*;
/*
* public class ListNode {
* int val;
* ListNode next = null;
* public ListNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param head ListNode类
* @param k int整型
* @return ListNode类
*/
public ListNode reverseKGroup (ListNode head, int k) {
//创建一个 dummy 节点,并将其指向给定的链表头部 head,这样做是为了简化操作。
ListNode dummy = new ListNode(-1);
dummy.next = head;
//初始化两个指针 pre 和 end,并且两者都指向 dummy 节点。
ListNode pre = dummy;
ListNode end = dummy;
while (end.next != null) {
//通过一个 for 循环,每次将 end 指针向后移动 k 步,直到找到需要翻转的区间的末尾节点或者链表已经遍历完
//找到需要翻转的区间的末尾节点后,我们将其后面的部分保存在一个临时变量 next 中。然后我们将 end 节点
//的next 指针指向 null,这样做是为了切断当前区间与后面部分的连接
for (int i = 0; i < k && end != null; i++) {
end = end.next;
}
if (end == null) {
break;
}
ListNode start = pre.next;
ListNode next = end.next;
end.next = null;
pre.next = reverse(start);
//将 pre 指针移动到翻转后的区间的头部,将 end 指针也移动到 pre 指针所在的位置,然后继续下一轮循环
start.next = next;
pre = start;
end = pre;
}
//返回 dummy 节点的 next 指针,即为翻转后的链表头部。
return dummy.next;
}
//翻转当前区间,将 pre 节点的 next 指针指向翻转后的区间头部,同时将翻转后的区间的末尾节点的 next 指针指向
//之前保存的 next
private ListNode reverse(ListNode head) {
ListNode pre = null;
ListNode cur = head;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
return pre;
}
}

查看16道真题和解析