1
+ // 这个有图,直接看链接吧。
2
+ // https://leetcode-cn.com/problems/reverse-nodes-in-k-group/
3
+ // hard
4
+
5
+ /**
6
+ * Definition for singly-linked list.
7
+ * function ListNode(val, next) {
8
+ * this.val = (val===undefined ? 0 : val)
9
+ * this.next = (next===undefined ? null : next)
10
+ * }
11
+ */
12
+ /**
13
+ * @param {ListNode } head
14
+ * @param {number } k
15
+ * @return {ListNode }
16
+ */
17
+
18
+ // 思路就是获取k个节点,然后翻转。
19
+ // 循环这个操作。
20
+ // 思路不难,个人感觉难点在于ListNode是在不好操作。
21
+ var reverseKGroup = function ( head , k ) {
22
+ function getKNodes ( head ) {
23
+ let nodes = [ ]
24
+ let newHead = head
25
+
26
+ //
27
+ while ( nodes . length < k && newHead ) {
28
+ nodes . push ( newHead )
29
+ newHead = newHead . next
30
+ }
31
+
32
+ return nodes
33
+ }
34
+
35
+ function reverse ( nodes ) {
36
+ // 将nodes里的ListNode关系翻转
37
+ if ( ! nodes . length ) {
38
+ return null
39
+ }
40
+
41
+ if ( nodes . length === 1 ) {
42
+ return [ nodes [ 0 ] , null , null ]
43
+ }
44
+
45
+ // 新开始的节点应为最后一个节点的下一个
46
+ let newStartNode = nodes [ nodes . length - 1 ] . next
47
+ // 最后一个节点是翻转前的第一个节点
48
+ let lastNode = nodes [ 0 ]
49
+
50
+ let rNodes = nodes . reverse ( )
51
+ // 翻转后的头节点是翻转后的最后一个节点。
52
+ let first = rNodes [ 0 ]
53
+ let indexF = first
54
+ for ( let i of rNodes . slice ( 1 ) ) {
55
+ i . next = null
56
+ indexF . next = i
57
+ indexF = i
58
+ }
59
+ // 返回新的头
60
+ // 和下次迭代应该开始新头,为原nodes[-1]的next
61
+ return [ first , newStartNode , lastNode ]
62
+
63
+ }
64
+
65
+ let first = getKNodes ( head )
66
+
67
+ if ( ! first . length ) {
68
+ return null
69
+ }
70
+
71
+ if ( first . length < k ) {
72
+ return head
73
+ }
74
+
75
+ let [ newHead , newStartNode , lastNode ] = reverse ( first )
76
+ let indexNewHead = lastNode
77
+
78
+ // 循环翻转
79
+ // newHead为新的head,返回用,newStartNode是下一次取K个node开始的节点。
80
+ // lastNode为当前节点的最后一个节点,用来将新的节点的head接到最后一个节点上。
81
+ while ( 1 ) {
82
+ if ( ! newStartNode ) {
83
+ return newHead
84
+ }
85
+ let kNodes = getKNodes ( newStartNode )
86
+ if ( kNodes . length < k ) {
87
+ if ( indexNewHead ) {
88
+ indexNewHead . next = kNodes [ 0 ]
89
+ }
90
+ return newHead
91
+ }
92
+
93
+ let [ n , ns , l ] = reverse ( kNodes )
94
+ indexNewHead . next = n
95
+ newStartNode = ns
96
+ lastNode = l
97
+ indexNewHead = l
98
+ }
99
+ } ;
0 commit comments