[Leetcode/Medium] 페어의 노드 스왑 (24. Swap Nodes in Pairs, Swift)
2024. 7. 10. 12:16ㆍAlgorithm
https://leetcode.com/problems/swap-nodes-in-pairs/
🤔 문제 설명
연결 리스트를 입력받아 인접한 두 노드(페어 단위)마다 교환(스왑)하고 연결 리스트를 반환해라.
단, 노드 자체만 변경할 수 있으며, 리스트의 노드 값을 수정해서는 안된다.
head = [1,2,3,4]
// [2,1,4,3]
💡 풀이
예시 문제를 기준으로 바꿔야 하는 값이 어떤 것인지만 헷갈리지 않고, 차근차근 코드를 짜면 해결할 수 있었다.
a->b->c 연결 리스트를 b->a->c로 바꿔주는 경우를 생각해 보자.
- 반복하는 대상(moveNodes)은 두 칸씩 이동하도록 한다. (반복 시에는 moveNodes.next값도 nil이 아니어야만 swap할 수 있음)
- 앞의 값을 first = a, 뒤의 값을 second = b라고 선언한다.
- 뒤의 값이 가리키는 대상(second.next)을 변수(var nextToNext)에 저장해둔다.
- 뒤의 값이 가리키는 대상(second.next)을 앞의 값(first)으로 지정한다.
- 앞의 값이 가리키는 대상(first.next)을 미리 3번에서 저장해 둔 기존 뒤의 값이 가리켰던 대상(nextToNext)으로 바꾼다.
- 앞의 값의 이전 값(prevNodes)이 뒤의 값(second)을 가리키도록 지정한다.
- 이동 (이전 값(prevNodes)은 a가 되도록, 시작점(moveNodes)은 c가 되도록)
조금 복잡한 내 머릿속에 과정을 쓰다보니 어려울 수도 있는데, 직접 이 문제를 푼다면 순서대로 어떻게 바뀌어야 할지, 저장해둬야 하는 값은 어떤 것일지를 차근차근 생각해보면 문제를 풀 수 있을 것이라 생각한다.
🧑🏻💻 코드 (Swift ver.)
💡 Runtime : 0ms (Beats 100.00%), Memory : 15.48MB (Beats 60.59%)
class Solution {
func swapPairs(_ head: ListNode?) -> ListNode? {
guard let head, let next = head.next else { return head }
let returnNodes = next
var prevNodes: ListNode? = nil
var moveNodes: ListNode? = head
while let first = moveNodes, let second = first.next {
var nextToNext = second.next
second.next = first
first.next = nextToNext
if let prevNodes { prevNodes.next = second }
moveNodes = nextToNext
prevNodes = first
}
return returnNodes
}
}
'Algorithm' 카테고리의 다른 글
[Leetcode/Medium] 홀짝 연결 리스트 (328. Odd Even Linked List, Swift) (0) | 2024.07.11 |
---|---|
[Leetcode/Medium] 두 수의 덧셈 (2. Add Two Numbers, Swift) (0) | 2024.07.10 |
[Leetcode/Easy] 두 정렬 리스트의 병합 (21. Merge Two Sorted Lists, Swift) (0) | 2024.07.09 |
[Leetcode/Easy] 역순 연결 리스트 (206. Reverse Linked List, Swift) (0) | 2024.07.07 |
[Leetcode/Easy] 팰린드롬 연결 리스트 (234. Palindrome Linked List, Swift) (0) | 2024.07.07 |