Leetcode

[Leetcode] 25. Reverse Nodes in k-Group - JS

Wix 2024. 11. 6. 10:00

https://leetcode.com/problems/reverse-nodes-in-k-group/description/?envType=study-plan-v2&envId=top-interview-150

 

1. 문제 분석

문제분석
--------------------
연결리스트의 head가 주어지면 리스트 그룹 k의 노드를 한 번에 반전시키고 수정된 목록을 반환합니다.
k는 양의 정수이고 연결된 목록의 길이보다 작거나 같습니다. 
노드의 개수가 k의 배수가 아닌 경우, 남은 노드는 결국 그대로 유지되어야 합니다.
목록 노드의 값은 변경할 수 없으며 노드 자체만 변경할 수 있습니다.

제한조건
--------------------
- 연결리스트 속 노드의 갯수는 n
- 1 <= k <= n < 5000
- 0 <= Node.val <= 1000

 

2. 접근 방법

접근방법
--------------------
현재 노드 위치의 index 있어야 전체 길이 n에서 남은 노드 갯수 파악이 가능하다.
전체 길이 n 구해주기 위해 임의의 변수에 head 할당

index = 0
dummy 노드 초기화
dummy.next = head
prev = dummy
curr = prev.next
next = null

while (n - index >= k) 반복
    우선 k 횟수만큼 노드를 역순
        - next 갱신
        - curr.next 갱신
        - next.next 갱신
        - prev.next 갱신
    prev = curr
    curr = prev.next
    index += k // 그룹 역순 끝나면 index 이동

dummy.next 반환

 

 

3. 코드

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
var reverseKGroup = function(head, k) {
    let n = 0;
    let countHead = head;  // head를 복사하여 순회용 변수로 사용
    while (countHead !== null) {
        countHead = countHead.next;
        n++;
    }
    
    let index = 0; // 현재 노드 위치
    const dummy = new ListNode();
    dummy.next = head;
    let prev = dummy;
    let curr = prev.next;
    let next = null;

    while (n - index >= k) {
        for (let i = 0; i < k - 1; i++) {
            next = curr.next;
            curr.next = next.next;
            next.next = prev.next;
            prev.next = next;
        }
        prev = curr;
        curr = prev.next;
        index += k;
    }
    return dummy.next;
};

 

 

4. 복잡도 분석

- 시간복잡도: O(n)

- 공간복잡도: O(1)

 

[Leetcode] 92. Reverse Linked List II - JS 이 문제에서 구간별 역순으로 노드를 배치하는 방법을 사용했고,

이후에 구간별 역순이 종료되었을 때, prev, curr 변수만 갱신해주면서

현재 노드의 인덱스를 이용하여 남은 노드의 갯수를 체크하여 반복문 종료조건을 추가해줬다.

 

비슷한 문제를 풀어본 뒤 접근하니 Hard 난이도의 문제로 쉽게 풀어서 신기했다.

결국 문제의 난이도는 중요하지 않고 여러 문제를 풀어보면서 낯익게 하는 것이 중요하다고 생각된다.