미리 전체 ListNode
를 순회하여 길이를 파악한 후, 꼬리가 될 지점의 이전 지점을 기점으로 k만큼 잘라 이어붙여 해결한다.
k만큼 실제로 이어붙일 경우 시간 초과가 발생하므로 반드시 k
를 ListNode
의 길이로 나눈 나머지 값으로 사용해야함
function rotateRight(head: ListNode | null, k: number): ListNode | null {
if (!head || !head.next) return head;
// 리스트의 길이를 계산하고 마지막 노드를 찾음
let oldTail = head;
let length = 1;
while (oldTail.next) {
oldTail = oldTail.next;
length++;
}
// k를 리스트 길이로 나눈 나머지를 구함 (불필요한 회전 제거)
k = k % length;
// k가 0이면 회전할 필요가 없음
if (k === 0) return head;
// 새로운 tail을 찾음 (회전 후 마지막 노드가 될 노드)
let newTail = head;
for (let i = 0; i < length - k - 1; i++) {
newTail = newTail.next!;
}
// 새로운 head를 설정하고 리스트를 재구성
let newHead = newTail.next;
newTail.next = null;
oldTail.next = head;
return newHead;
}