티스토리 뷰

728x90
반응형

문제

연결 리스트를 뒤집어라.

입력 : 1 → 2 → 3 → 4 → 5 → NULL
출력 : 5 → 4 → 3 → 2 → 1 → NULL

코드

"""
fixme
 https://leetcode.com/problems/reverse-linked-list/
 Q15. 역순 연결 리스트
 연결 리스트를 뒤집어라.
 입력 : 1 → 2 → 3 → 4 → 5 → NULL
 출력 : 5 → 4 → 3 → 2 → 1 → NULL
"""


class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


class Solution:
    def reverseListRecur(self, head: ListNode) -> ListNode:
        def reverse(node: ListNode, prev: ListNode = None):
            if not node:
                return prev
            next, node.next = node.next, prev
            print(prev.val)
            return reverse(next, node)

        return reverse(head)

    def reverseListList(self, head: ListNode) -> ListNode:
        node, prev = head, None

        while node:
            next, node.next = node.next, prev
            prev, node = node, next

        return prev


Solution().reverseListRecur(ListNode(1, ListNode(2, ListNode(3, ListNode(4, ListNode(5))))))

풀이

재귀함수를 이용한 풀이에서 두번째 인자가 prev이고, 첫번째 인자 node가 없으면 그대로 prev 자체를 return한다. 계속 1 → prev, 2 → 1 → prev … 형태로 이어져서 헷갈릴 수 있는데 함수가 호출될 때 1 → prev, 2 → 1 → prev …자체가 prev가 된다. 그래서 결국 마지막에 5 → 4 → 3 → 2 → 1 → prev(None) 자체가 prev이고, 이것이 return된다.

아래 그림은 호출되면서 연결 리스트가 변하는 모습이다.

example



출처
파이썬 알고리즘 인터뷰 (글 : 박상길 그림 : 정진호) [책만]

728x90
반응형
댓글
반응형
250x250
글 보관함
최근에 달린 댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday
링크