문제링크: https://leetcode.com/problems/reverse-nodes-in-k-group/
노드의 k번째마다 순서를 뒤집는 문제다. O(1)
의 추가 공간복잡도를 만족해야 한다.
스택을 이용하면 reverse
를 간단하게 구현할 수 있지만,O(1)
의 공간복잡도를 만족하기 위해서는 동적 포인터를 이용해 reverse
를 구현해야 한다. reverse
함수를 만든 후 반복을 통해 노드를 순회하고 count
를 세며 k번째 노드를 만났을 경우 reverse
를 실행한다.
reverse
함수는 뒤집을 노드의 바로 앞left
와 노드의 끝end
를 인자로 받는다.left
의 다음을cur
로 지정하고 cur.next
를 추가로 저장한다.(다음반복을 위한 노드)cur
이 loopEnd
가 아닐 때까지 cur
를 right
(오른쪽 노드)에 연결하는 것을 반복한다.left
와 end
를 연결한다.(reverse
완성)count
를 늘리고 k
번째마다 실행한다.var reverseKGroup = function(head, k) {
// left와 end를 기준으로 reverse
const reverse = (left, end) => {
const result = left.next;
let right = end.next;
const loopEnd = right;
let cur = left.next;
while (cur !== loopEnd) {
const next = cur.next;
cur.next = right;
right = cur;
cur = next;
}
//
left.next = end;
return result;
}
if (k === 1) return head;
const dummy = new ListNode(0, head);
let nodeStart = dummy;
let curNode = dummy.next;
let count = 1;
while (curNode) {
if (count === k) {
curNode = reverse(nodeStart, curNode);
nodeStart = curNode;
count = 0;
}
count++;
curNode = curNode.next;
}
return dummy.next;
};