[Leetcode/Medium] 페어의 노드 스왑 (24. Swap Nodes in Pairs, Swift)

2024. 7. 10. 12:16Algorithm

https://leetcode.com/problems/swap-nodes-in-pairs/

 

🤔 문제 설명

연결 리스트를 입력받아 인접한 두 노드(페어 단위)마다 교환(스왑)하고 연결 리스트를 반환해라.

단, 노드 자체만 변경할 수 있으며, 리스트의 노드 값을 수정해서는 안된다.

head = [1,2,3,4]
// [2,1,4,3]

 

💡 풀이

예시 문제를 기준으로 바꿔야 하는 값이 어떤 것인지만 헷갈리지 않고, 차근차근 코드를 짜면 해결할 수 있었다.
a->b->c 연결 리스트를 b->a->c로 바꿔주는 경우를 생각해 보자. 

  1. 반복하는 대상(moveNodes)은 두 칸씩 이동하도록 한다. (반복 시에는 moveNodes.next값도 nil이 아니어야만 swap할 수 있음)
  2. 앞의 값을 first = a, 뒤의 값을 second = b라고 선언한다.
  3. 뒤의 값이 가리키는 대상(second.next)을 변수(var nextToNext)에 저장해둔다.
  4. 뒤의 값이 가리키는 대상(second.next)을 앞의 값(first)으로 지정한다.
  5. 앞의 값이 가리키는 대상(first.next)을 미리 3번에서 저장해 둔 기존 뒤의 값이 가리켰던 대상(nextToNext)으로 바꾼다.
  6. 앞의 값의 이전 값(prevNodes)이 뒤의 값(second)을 가리키도록 지정한다.
  7. 이동 (이전 값(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
    }
}