1 import java.util.*;
2
3 /*
4 * public class ListNode {
5 * int val;
6 * ListNode next = null;
7 * }
8 */
9
10 public class Solution {
11 /**
12 *
13 * @param head ListNode类
14 * @param k int整型
15 * @return ListNode类
16 */
17 public ListNode reverseKGroup (ListNode head, int k) {
18 // 统计链表长度length
19 int length = 0;
20 ListNode current = head;
21 while(current != null) {
22 length = length + 1;
23 current = current.next;
24 }
25 // 校验特殊场景
26 if (k > length) {
27 return head;
28 }
29 // 初始最终链表的头节点
30 ListNode root = head;
31 // 分length/k次执行局部链表翻转
32 for (int i = 1; i <= length / k; i ++) {
33 root = reverseBetween(root, 1 + k * (i - 1), k * i);
34 }
35 // 返回结果
36 return root;
37 }
38
39 public ListNode reverseBetween (ListNode head, int m, int n) {
40 // 添加表头
41 ListNode root = new ListNode(-1);
42 root.next = head;
43 // 局部链表的开始节点
44 ListNode begin = root;
45 // 局部链表的结束节点
46 ListNode end = root;
47 // 局部链表左边的节点
48 ListNode left = null;
49 // 局部链表右边的节点
50 ListNode right = null;
51 // 依次寻找局部链表的四个节点
52 for (int i = 0; i < m; i ++) {
53 left = begin;
54 begin = begin.next;
55 }
56 for (int i = 0; i < n; i ++) {
57 end = end.next;
58 right = end.next;
59 }
60 // 断开连接
61 left.next = null;
62 end.next = null;
63 // 反转局部链表
64 reverseList(begin);
65 // 连接反转后的链表
66 left.next = end;
67 begin.next = right;
68 // 返回结果
69 return root.next;
70 }
71
72 public ListNode reverseList(ListNode head) {
73 // 申请临时变量
74 ListNode current = head;
75 ListNode pre = null;
76 // 依次调换指针的方向
77 while (current != null) {
78 // 记录下个要处理的节点
79 ListNode next = current.next;
80 // 调换当前节点的指针方向
81 current.next = pre;
82 // 移动到下个要处理的节点
83 pre = current;
84 current = next;
85 }
86 // 返回调换后的头节点
87 return pre;
88 }
89 }