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