본문 바로가기
코드

Reverse Linked List

by ehei 2019. 10. 24.

단방향 연결 리스트를 뒤집는 문제

https://leetcode.com/problems/reverse-linked-list/

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def reverseList( self, head: ListNode ) -> ListNode:
        if head is  None:
            return head
        else:
            reversedHead, _ = self.__reverseListIteratively( head )
            head.next = None

            return reversedHead


    def __reverseListIteratively( self, head ):
        if head is None:
            return None, None
        else:
            reversedHead, reversedTail = self.__reverseListIteratively( head.next )

            if reversedTail is None:
                return head, head
            else:
                reversedTail.next = head

                return reversedHead, head


    def __reverseListRecusively( self, head, otherHead = None ):
        '''연결 리스트의 말단까지 들어가면서 연결을 뒤집는다
        '''
        if head is None:
            return head
        else:
            newHead = head.next

            # 말단에 도달했으면 이전 노드를 말단으로 삼는다
            if newHead is None:
                head.next = otherHead

                return head
            else:
                # 처음으로 탐색했으면 첨단 노드가 다음 노드를 가리키지 않도록 한다
                if otherHead is None:
                    otherHead = head
                    head.next = None
                # 탐색 중이면 이전 노드를 가리키도록 한다
                else:
                    head.next = otherHead
                    otherHead = head

                return self.__reverseListRecusively( newHead, otherHead )

'코드' 카테고리의 다른 글

Climbing Stairs  (0) 2019.10.24
Fibonacci Number  (0) 2019.10.24
Swap Nodes in Pairs  (0) 2019.10.24
Reverse String  (0) 2019.10.24
랜덤 던전 생성  (0) 2019.09.10