diff --git a/javascript/25-Reverse-Nodes-in-K-Group.js b/javascript/25-Reverse-Nodes-in-K-Group.js new file mode 100644 index 000000000..6b99b3815 --- /dev/null +++ b/javascript/25-Reverse-Nodes-in-K-Group.js @@ -0,0 +1,51 @@ +/** + * Definition for singly-linked list. + * function ListNode(val, next) { + * this.val = (val===undefined ? 0 : val) + * this.next = (next===undefined ? null : next) + * } + */ +/** + * @param {ListNode} head + * @param {number} k + * @return {ListNode} + */ +var reverseKGroup = function(head, k) { + let dummy = new ListNode(0, head); + let groupPrev = dummy; + + while (true) { + let kth = getKth(groupPrev, k); + if (!kth) { + break; + } + + let groupNext = kth.next; + + // reverse group + let prev = kth.next; + let curr = groupPrev.next; + + while (curr !== groupNext) { + let temp = curr.next; + curr.next = prev; + prev = curr; + curr = temp; + } + + let temp = groupPrev.next; + groupPrev.next = kth; + groupPrev = temp; + } + + return dummy.next; +}; + +function getKth(curr, k) { + while (curr && k > 0) { + curr = curr.next; + k -= 1; + } + + return curr; +} \ No newline at end of file