File tree 2 files changed +125
-0
lines changed
solution/025.Reverse Nodes in k-Group
2 files changed +125
-0
lines changed Original file line number Diff line number Diff line change
1
+ ## k个一组翻转链表
2
+ ### 题目描述
3
+
4
+ 给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表。
5
+
6
+ k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序。
7
+
8
+ 示例 :
9
+
10
+ 给定这个链表:1->2->3->4->5
11
+
12
+ 当 k = 2 时,应当返回: 2->1->4->3->5
13
+
14
+ 当 k = 3 时,应当返回: 3->2->1->4->5
15
+
16
+ 说明 :
17
+
18
+ 你的算法只能使用常数的额外空间。
19
+ 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换
20
+
21
+ ### 解法
22
+ 1 . 在 head 节点前增加一个头节点 reNode 使所有的翻转操作情况一致。
23
+ 2 . 维护一个 num 计数,指针 pNode 从 head 节点开始,每经过 k 个节点,进行一次 k 个节点的翻转
24
+ 3 . 将翻转后的 k 个节点与前后组的节点相连
25
+
26
+ ``` java
27
+ /**
28
+ * Definition for singly-linked list.
29
+ * public class ListNode {
30
+ * int val;
31
+ * ListNode next;
32
+ * ListNode(int x) { val = x; }
33
+ * }
34
+ */
35
+ class Solution {
36
+ public ListNode reverseKGroup (ListNode head , int k ) {
37
+ if (head == null || k < 2 ) {
38
+ return head;
39
+ }
40
+ int num = 0 ;
41
+ ListNode pNode = head;
42
+ ListNode lastNode = new ListNode (0 );
43
+ ListNode reNode = lastNode;
44
+ lastNode. next = head;
45
+ while (pNode != null ) {
46
+ num++ ;
47
+ if (num >= k) {
48
+ num = 0 ;
49
+ ListNode tempNode = pNode. next;
50
+ reserver(lastNode. next, k);
51
+ // k 个节点的尾节点指向下一组的头节点
52
+ lastNode. next. next = tempNode;
53
+ // 上一组的尾节点指向当前 k 个节点的头节点
54
+ tempNode = lastNode. next;
55
+ lastNode. next = pNode;
56
+
57
+ lastNode = tempNode;
58
+ pNode = lastNode. next;
59
+ }
60
+ else {
61
+ pNode = pNode. next;
62
+ }
63
+ }
64
+ return reNode. next;
65
+ }
66
+
67
+ private ListNode reserver (ListNode node , int i ) {
68
+ if (i <= 1 || node. next == null ) {
69
+ return node;
70
+ }
71
+ ListNode lastNode = reserver(node. next, i - 1 );
72
+ lastNode. next = node;
73
+ return node;
74
+ }
75
+ }
76
+ ```
Original file line number Diff line number Diff line change
1
+ /**
2
+ * Definition for singly-linked list.
3
+ * public class ListNode {
4
+ * int val;
5
+ * ListNode next;
6
+ * ListNode(int x) { val = x; }
7
+ * }
8
+ */
9
+ class Solution {
10
+ public ListNode reverseKGroup (ListNode head , int k ) {
11
+ if (head == null || k < 2 ) {
12
+ return head ;
13
+ }
14
+ int num = 0 ;
15
+ ListNode pNode = head ;
16
+ ListNode lastNode = new ListNode (0 );
17
+ ListNode reNode = lastNode ;
18
+ lastNode .next = head ;
19
+ while (pNode != null ) {
20
+ num ++;
21
+ if (num >= k ) {
22
+ num = 0 ;
23
+ ListNode tempNode = pNode .next ;
24
+ reserver (lastNode .next , k );
25
+ // k 个节点的尾节点指向下一组的头节点
26
+ lastNode .next .next = tempNode ;
27
+ // 上一组的尾节点指向当前 k 个节点的头节点
28
+ tempNode = lastNode .next ;
29
+ lastNode .next = pNode ;
30
+
31
+ lastNode = tempNode ;
32
+ pNode = lastNode .next ;
33
+ }
34
+ else {
35
+ pNode = pNode .next ;
36
+ }
37
+ }
38
+ return reNode .next ;
39
+ }
40
+
41
+ private ListNode reserver (ListNode node , int i ) {
42
+ if (i <= 1 || node .next == null ) {
43
+ return node ;
44
+ }
45
+ ListNode lastNode = reserver (node .next , i - 1 );
46
+ lastNode .next = node ;
47
+ return node ;
48
+ }
49
+ }
You can’t perform that action at this time.
0 commit comments