| 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 | // 循环翻转 |