Node를 원하는 만큼 뒤집을 수 있는지 검증하는 문제이다.
탐색은 기존과 동일하게 진행되며 중요 부분은 k 만큼의 배열을 뒤집는 과정이다.
function reverseKGroup(head: ListNode | null, k: number): ListNode | null {
// 헤드가 null이거나 k가 1이면 변경 없이 반환
if (!head || k === 1) return head;
// 더미 노드 생성
const dummy = new ListNode(0);
dummy.next = head;
// 현재 그룹의 이전 노드, 시작 노드, 끝 노드를 추적
let prevGroupTail = dummy;
let start = head;
let end = head;
while (start) {
// k개의 노드 탐색
for (let i = 0; i < k - 1 && end; i++) {
end = end.next;
}
if (!end) break;
// 다음 그룹의 시작 노드를 저장
const nextGroupStart = end.next;
// 뒤집기
[start, end] = reverseList(start, end);
// 뒤집기 후 연결
prevGroupTail.next = start;
end.next = nextGroupStart;
// 다음 그룹 이동
prevGroupTail = end;
start = end.next;
end = start;
}
return dummy.next;
}
// 시작과 끝 노드 사이의 리스트를 뒤집는 함수
function reverseList(start: ListNode, end: ListNode): [ListNode, ListNode] {
let prev = null;
let curr = start;
const endNext = end.next;
while (curr !== endNext) {
const next = curr.next;
curr.next = prev;
prev = curr;
curr = next;
}
return [end, start];
}