File tree Expand file tree Collapse file tree 2 files changed +125
-0
lines changed
solution/025.Reverse Nodes in k-Group Expand file tree Collapse file tree 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