@@ -65,7 +65,7 @@ curr = temp;
65
65
![ reverse k nodes in linked list] ( ../assets/problems/25.reverse-nodes-in-k-groups-2.PNG )
66
66
67
67
68
- > ** NOTE** : 一般情况下对链表的操作,都有可能会引入一个新的` dummy node ` ,因为` head ` 有可能会改变。这里` head 从1->3 ` ,
68
+ > ** NOTE** : 一般情况下对链表的操作,都有可能会引入一个新的` dummy node ` ,因为` head ` 有可能会改变。这里` head 从1->3 ` ,
69
69
` dummy (List(0)) ` 保持不变。
70
70
71
71
#### 复杂度分析
@@ -78,7 +78,7 @@ curr = temp;
78
78
3 . 对每一组进行翻转,更换起始和最后的位置
79
79
4 . 返回` dummy.next ` .
80
80
81
- ## 代码 (` Java/Python3 ` )
81
+ ## 代码 (` Java/Python3/javascript ` )
82
82
* Java Code*
83
83
``` java
84
84
class ReverseKGroupsLinkedList {
@@ -88,7 +88,7 @@ class ReverseKGroupsLinkedList {
88
88
}
89
89
ListNode dummy = new ListNode (0 );
90
90
dummy. next = head;
91
-
91
+
92
92
ListNode start = dummy;
93
93
ListNode end = head;
94
94
int count = 0 ;
@@ -105,21 +105,21 @@ class ReverseKGroupsLinkedList {
105
105
}
106
106
return dummy. next;
107
107
}
108
-
109
- /**
108
+
109
+ /**
110
110
* reverse linked list from range (start, end), return last node.
111
- * for example:
111
+ * for example:
112
112
* 0->1->2->3->4->5->6->7->8
113
113
* | |
114
114
* start end
115
- *
115
+ *
116
116
* After call start = reverse(start, end)
117
- *
117
+ *
118
118
* 0->3->2->1->4->5->6->7->8
119
119
* | |
120
120
* start end
121
121
* first
122
- *
122
+ *
123
123
*/
124
124
private ListNode reverse (ListNode start , ListNode end ) {
125
125
ListNode curr = start. next;
@@ -157,7 +157,7 @@ class Solution:
157
157
else :
158
158
end = end.next
159
159
return dummy.next
160
-
160
+
161
161
def reverse (self , start , end ):
162
162
prev, curr = start, start.next
163
163
first = curr
@@ -168,7 +168,49 @@ class Solution:
168
168
curr = temp
169
169
start.next = prev
170
170
first.next = curr
171
- return first
171
+ return first
172
+ ```
173
+
174
+ * javascript code*
175
+ ``` js
176
+ /**
177
+ * @param {ListNode} head
178
+ * @param {number} k
179
+ * @return {ListNode}
180
+ */
181
+ var reverseKGroup = function (head , k ) {
182
+ // 标兵
183
+ let dummy = new ListNode ()
184
+ dummy .next = head
185
+ let [start, end] = [dummy, dummy .next ]
186
+ let count = 0
187
+ while (end) {
188
+ count++
189
+ if (count % k === 0 ) {
190
+ start = reverseList (start, end .next )
191
+ end = start .next
192
+ } else {
193
+ end = end .next
194
+ }
195
+ }
196
+ return dummy .next
197
+
198
+ // 翻转stat -> end的链表
199
+ function reverseList (start , end ) {
200
+ let [pre, cur] = [start, start .next ]
201
+ const first = cur
202
+ while (cur !== end) {
203
+ let next = cur .next
204
+ cur .next = pre
205
+ pre = cur
206
+ cur = next
207
+ }
208
+ start .next = pre
209
+ first .next = cur
210
+ return first
211
+ }
212
+ };
213
+
172
214
```
173
215
174
216
## 参考(References)
@@ -178,13 +220,13 @@ class Solution:
178
220
179
221
- 要求从后往前以` k ` 个为一组进行翻转。** (字节跳动(ByteDance)面试题)**
180
222
181
- 例子,` 1->2->3->4->5->6->7->8, k = 3 ` ,
182
-
223
+ 例子,` 1->2->3->4->5->6->7->8, k = 3 ` ,
224
+
183
225
从后往前以` k=3 ` 为一组,
184
- - ` 6->7->8 ` 为一组翻转为` 8->7->6 ` ,
185
- - ` 3->4->5 ` 为一组翻转为` 5->4->3 ` .
226
+ - ` 6->7->8 ` 为一组翻转为` 8->7->6 ` ,
227
+ - ` 3->4->5 ` 为一组翻转为` 5->4->3 ` .
186
228
- ` 1->2 ` 只有2个nodes少于` k=3 ` 个,不翻转。
187
-
229
+
188
230
最后返回: ` 1->2->5->4->3->8->7->6 `
189
231
190
232
这里的思路跟从前往后以` k ` 个为一组进行翻转类似,可以进行预处理:
0 commit comments