25. K 个一组翻转链表
题解参考:https://leetcode.cn/problems/reverse-nodes-in-k-group/solutions/10416/tu-jie-kge-yi-zu-fan-zhuan-lian-biao-by-user7208t/
设置dummy
虚拟头节点,pre
为待翻转部分的前驱(用于连接),end
为待翻转部分中的结尾节点(用k
定),next
为待翻转部分的后续节点(用于连接),bg
为翻转前的翻转部分的开始节点,进入reverse
后,会有cur
节点作为副本,因此bg
的位置不会变,翻转后,bg
所在节点变成了结尾,将其和next
相连,reverse
返回的节点(新开始节点)和pre
相连。
pre
指向bg
,作为下一个待翻转部分的前驱。
end
指向pre
,从pre
出发数k
个节点。
/*** 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, head);ListNode pre = dummy, end = dummy;while (end.next != null) {for (int i = 0; i < k && end != null; ++i) end = end.next; // 注意只要访问next节点,就要检查这个节点是否为空if (end == null) break;ListNode bg = pre.next;ListNode nxt = end.next;end.next = null;pre.next = reverse(bg);bg.next = nxt;pre = bg;end = pre;}return dummy.next;}private ListNode reverse(ListNode head) { ListNode pre = null;ListNode cur = head;while (cur != null) {ListNode nxt = cur.next;cur.next = pre;pre = cur;cur = nxt;}return pre;}
}