Leetcode
[Leetcode] 25. Reverse Nodes in k-Group - JS
Wix
2024. 11. 6. 10:00

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 난이도의 문제로 쉽게 풀어서 신기했다.
결국 문제의 난이도는 중요하지 않고 여러 문제를 풀어보면서 낯익게 하는 것이 중요하다고 생각된다.