From 65c7d88a3b74551cc1a9b40088cc12988fd3a749 Mon Sep 17 00:00:00 2001 From: gyeo-ri Date: Sat, 18 Apr 2026 21:42:03 +0900 Subject: [PATCH 1/5] =?UTF-8?q?feat:=20=EB=B0=98=EB=B3=B5=EB=AC=B8?= =?UTF-8?q?=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reverse-linked-list/gyeo-ri.py | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 reverse-linked-list/gyeo-ri.py diff --git a/reverse-linked-list/gyeo-ri.py b/reverse-linked-list/gyeo-ri.py new file mode 100644 index 0000000000..c64015f75e --- /dev/null +++ b/reverse-linked-list/gyeo-ri.py @@ -0,0 +1,47 @@ +# Definition for singly-linked list. +class ListNode: + def __init__(self, val=0, next=None): + self.val: int = val + self.next: ListNode | None = next + + +class Solution: + def reverseList(self, head: ListNode | None) -> ListNode | None: + reversed_node = None + + while head: + reversed_node = ListNode(head.val, next=reversed_node) + + if not head.next: + return reversed_node + + else: + head = head.next + + +if __name__ == "__main__": + test_cases = [ + ([1, 2, 3, 4, 5], [5, 4, 3, 2, 1]), + ([1, 2], [2, 1]), + ([], []), + ] + + solution = Solution() + + for idx, (inp, expected) in enumerate(test_cases, start=1): + head = None + for value in reversed(inp): + head = ListNode(value, head) + + result = solution.reverseList(head) + + result_list = [] + while result is not None: + result_list.append(result.val) + result = result.next + + assert ( + result_list == expected + ), f"Test Case {idx} Failed: Expected {expected}, Got {result_list}" + + print("All test cases passed.") From 1fa2f2a7f4f0b8db7d1d20468e96db0ef9b7c0cf Mon Sep 17 00:00:00 2001 From: gyeo-ri Date: Sat, 18 Apr 2026 22:08:11 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=EA=B8=B0=EC=A1=B4=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B0=80=EB=8F=85=EC=84=B1=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reverse-linked-list/gyeo-ri.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/reverse-linked-list/gyeo-ri.py b/reverse-linked-list/gyeo-ri.py index c64015f75e..46a711dd67 100644 --- a/reverse-linked-list/gyeo-ri.py +++ b/reverse-linked-list/gyeo-ri.py @@ -7,16 +7,16 @@ def __init__(self, val=0, next=None): class Solution: def reverseList(self, head: ListNode | None) -> ListNode | None: + current_node = head reversed_node = None - while head: - reversed_node = ListNode(head.val, next=reversed_node) + while current_node: + reversed_node = ListNode(current_node.val, next=reversed_node) - if not head.next: + if not current_node.next: return reversed_node - else: - head = head.next + current_node = current_node.next if __name__ == "__main__": From 705d43fc74fe6a12b57f8f9e73e5fbf5ff2b9172 Mon Sep 17 00:00:00 2001 From: gyeo-ri Date: Sat, 18 Apr 2026 22:17:57 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=EB=A9=94=EB=AA=A8=EB=A6=AC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EB=9F=89=20=EC=A0=88=EA=B0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reverse-linked-list/gyeo-ri.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/reverse-linked-list/gyeo-ri.py b/reverse-linked-list/gyeo-ri.py index 46a711dd67..0119623f42 100644 --- a/reverse-linked-list/gyeo-ri.py +++ b/reverse-linked-list/gyeo-ri.py @@ -11,12 +11,14 @@ def reverseList(self, head: ListNode | None) -> ListNode | None: reversed_node = None while current_node: - reversed_node = ListNode(current_node.val, next=reversed_node) + next_node = current_node.next + current_node.next = reversed_node - if not current_node.next: - return reversed_node + if next_node is None: + return current_node - current_node = current_node.next + reversed_node = current_node + current_node = next_node if __name__ == "__main__": From 0b94abbc140583bb8f9e8e92f23b502c0603c324 Mon Sep 17 00:00:00 2001 From: gyeo-ri Date: Sat, 18 Apr 2026 22:56:02 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=EC=9E=AC=EA=B7=80=EB=A5=BC=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=ED=95=9C=20=ED=92=80=EC=9D=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reverse-linked-list/gyeo-ri.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/reverse-linked-list/gyeo-ri.py b/reverse-linked-list/gyeo-ri.py index 0119623f42..995599ca22 100644 --- a/reverse-linked-list/gyeo-ri.py +++ b/reverse-linked-list/gyeo-ri.py @@ -5,6 +5,29 @@ def __init__(self, val=0, next=None): self.next: ListNode | None = next +# 재귀를 사용한 최종 풀이 +class Solution: + def reverseList(self, head: ListNode | None) -> ListNode | None: + # 1. 리스트가 비었거나(head is None) 마지막 노드일 때(head.next is None)는 종료 + if head is None or head.next is None: + return head + + # 2. 현재 노드(=head)를 제외하고, 다음 노드(next_node)부터 끝까지를 재귀 호출(뒤쪽 리스트를 뒤집기) + next_node = head.next + reversed_node = self.reverseList(next_node) + + # 3. 현재 노드를 뒤집힌 이전 노드(reversed_node)의 뒤에 붙이기 + # reversed_node의 가장 끝은 head.next이므로, head를 next_node 뒤에 붙인 다음 마지막 노드로 표시(head.next = None) + next_node.next = head + head.next = None + + # 4. 최종 노드를 반환 + # 2의 reversed_node는 head(=마지막 노드)가 빠진 상태였지만 3에서 next_node -> head를 연결하면서 완성됨 + return reversed_node + + +""" +# 반복문을 사용한 풀이 class Solution: def reverseList(self, head: ListNode | None) -> ListNode | None: current_node = head @@ -19,6 +42,7 @@ def reverseList(self, head: ListNode | None) -> ListNode | None: reversed_node = current_node current_node = next_node +""" if __name__ == "__main__": From f3179cb5f1660918a739fd52164d21ff028053cb Mon Sep 17 00:00:00 2001 From: gyeo-ri Date: Sat, 18 Apr 2026 23:02:27 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EA=B2=B0=EA=B3=BC=20=EC=9A=94?= =?UTF-8?q?=EC=95=BD=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reverse-linked-list/gyeo-ri.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/reverse-linked-list/gyeo-ri.py b/reverse-linked-list/gyeo-ri.py index 995599ca22..f00908d9a5 100644 --- a/reverse-linked-list/gyeo-ri.py +++ b/reverse-linked-list/gyeo-ri.py @@ -1,3 +1,16 @@ +""" +[결과 요약] +# 시도한 로직 수: 3 + 1. 반복문을 사용한 풀이: 코드는 짧고 성능은 좋지만 (새로운 노드 객체 정의를 위해) 불필요한 메모리 사용이 있어 (2)에서 개선함 + - 시간복잡도 O(n) / 공간복잡도 O(n) + 2. 반복문 풀이와 메모리 개선: 기존 노드(ListNode)의 연결 관계(next)를 직접 바꾸는 방식) + - 시간복잡도 O(n) / 공간복잡도 O(1) + 3. 재귀 풀이: 반복문과 시간복잡도는 동일하나 실제 실행 속도가 약간 느리고, 공간복잡도에서는 불리함 + - 재귀는 기본적으로 공간의 깊이에 비례하여 O(1)의 공간복잡도가 나오기는 어려움 + - 시간복잡도 O(n) / 공간복잡도 O(n) +""" + + # Definition for singly-linked list. class ListNode: def __init__(self, val=0, next=None):