본문 바로가기
CodeSignal

reverseNodesInKGroups

by Doromi 2024. 3. 15.
728x90
반응형

주어진 연결 리스트 l의 노드들을 크기 k씩 뒤집고 수정된 리스트를 반환해야 합니다.
k는 양수이며, l의 길이보다 작거나 같아야 합니다.
만약 연결 리스트의 노드 수가 k의 배수가 아니라면, 뒤에 남은 노드는 그대로 유지되어야 합니다.
노드의 값은 변경할 수 없으며, 노드 자체만 변경할 수 있습니다.
예시:
예시 1: l = [1, 2, 3, 4, 5]이고 k = 2인 경우, 출력은 [2, 1, 4, 3, 5]가 되어야 합니다.
예시 2: l = [1, 2, 3, 4, 5]이고 k = 1인 경우, 출력은 [1, 2, 3, 4, 5]가 되어야 합니다.
예시 3: l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]이고 k = 3인 경우, 출력은 [3, 2, 1, 6, 5, 4, 9, 8, 7, 10, 11]이 되어야 합니다.

// Singly-linked lists are already defined with this interface:
// class ListNode<T> {
//   public T value { get; set; }
//   public ListNode<T> next { get; set; }
// }

ListNode<int> solution(ListNode<int> l, int k) {
    if(l == null || k ==1) return l;
    
    ListNode<int> dummy = new ListNode<int>();
    dummy.value = -1;
    dummy.next = l;
    ListNode<int> prevGrpEnd = dummy;
    ListNode<int> curr = l;
    int count  = 0;
    
    while(curr != null){
        curr = curr.next;
        count++;
    }
    
    curr = l;
    while(count >= k){
        ListNode<int> grpStart = curr;
        ListNode<int> prev = null;
        
        for(int i = 0;i<k;i++){
            ListNode<int> next = curr.next;
            curr.next =  prev;
            prev = curr;
            curr = next;
        }
        
        prevGrpEnd.next = prev;
        grpStart.next = curr;
        prevGrpEnd = grpStart;
        count -= k;
        
    }
    return dummy.next;
}

 

  • 쌍으로 노드를 뒤집는 과정입니다 (k = 2):
원래 리스트: 1 -> 2 -> 3 -> 4 -> 5 -> ...
  • 첫 번째 그룹을 뒤집은 후:
뒤집힌 그룹: 2 -> 1
남은 리스트: 3 -> 4 -> 5 -> ...
  • 뒤집힌 그룹을 이전 그룹에 연결합니다:
연결된 리스트: 2 -> 1 -> 3 -> 4 -> 5 -> ...
  • 다음 그룹 (3 -> 4)에 대해 반복합니다.
prevGroupEnd = groupStart;는 그룹을 뒤집은 후 이전 그룹의 끝 노드를 현재 그룹의 시작 노드로 업데이트하는 부분입니다. 이 작업을 하는 이유는 다음과 같습니다:
연결 유지:
그룹을 뒤집을 때, 그룹 내의 노드들은 순서가 반대로 되어야 합니다.
그룹을 뒤집은 후에는 이전 그룹의 끝 노드와 현재 그룹의 시작 노드를 연결해야 합니다.
이렇게 하면 뒤집힌 그룹들이 전체 리스트에서 올바르게 연결됩니다.
728x90
반응형

'CodeSignal' 카테고리의 다른 글

rearrangeLastN  (0) 2024.03.20
mergeTwoLinkedLists  (4) 2024.03.14
addTwoHugeNumbers  (0) 2024.03.11
isListPalindrome  (0) 2024.03.09
removeKFromList  (0) 2024.03.08