Skip to content

Commit c63c0cc

Browse files
authored
Merge pull request #7 from gyeo-ri/reverse-linked-list
206. Reverse Linked List
2 parents 6b31bb8 + f3179cb commit c63c0cc

1 file changed

Lines changed: 86 additions & 0 deletions

File tree

reverse-linked-list/gyeo-ri.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
"""
2+
[결과 요약]
3+
# 시도한 로직 수: 3
4+
1. 반복문을 사용한 풀이: 코드는 짧고 성능은 좋지만 (새로운 노드 객체 정의를 위해) 불필요한 메모리 사용이 있어 (2)에서 개선함
5+
- 시간복잡도 O(n) / 공간복잡도 O(n)
6+
2. 반복문 풀이와 메모리 개선: 기존 노드(ListNode)의 연결 관계(next)를 직접 바꾸는 방식)
7+
- 시간복잡도 O(n) / 공간복잡도 O(1)
8+
3. 재귀 풀이: 반복문과 시간복잡도는 동일하나 실제 실행 속도가 약간 느리고, 공간복잡도에서는 불리함
9+
- 재귀는 기본적으로 공간의 깊이에 비례하여 O(1)의 공간복잡도가 나오기는 어려움
10+
- 시간복잡도 O(n) / 공간복잡도 O(n)
11+
"""
12+
13+
14+
# Definition for singly-linked list.
15+
class ListNode:
16+
def __init__(self, val=0, next=None):
17+
self.val: int = val
18+
self.next: ListNode | None = next
19+
20+
21+
# 재귀를 사용한 최종 풀이
22+
class Solution:
23+
def reverseList(self, head: ListNode | None) -> ListNode | None:
24+
# 1. 리스트가 비었거나(head is None) 마지막 노드일 때(head.next is None)는 종료
25+
if head is None or head.next is None:
26+
return head
27+
28+
# 2. 현재 노드(=head)를 제외하고, 다음 노드(next_node)부터 끝까지를 재귀 호출(뒤쪽 리스트를 뒤집기)
29+
next_node = head.next
30+
reversed_node = self.reverseList(next_node)
31+
32+
# 3. 현재 노드를 뒤집힌 이전 노드(reversed_node)의 뒤에 붙이기
33+
# reversed_node의 가장 끝은 head.next이므로, head를 next_node 뒤에 붙인 다음 마지막 노드로 표시(head.next = None)
34+
next_node.next = head
35+
head.next = None
36+
37+
# 4. 최종 노드를 반환
38+
# 2의 reversed_node는 head(=마지막 노드)가 빠진 상태였지만 3에서 next_node -> head를 연결하면서 완성됨
39+
return reversed_node
40+
41+
42+
"""
43+
# 반복문을 사용한 풀이
44+
class Solution:
45+
def reverseList(self, head: ListNode | None) -> ListNode | None:
46+
current_node = head
47+
reversed_node = None
48+
49+
while current_node:
50+
next_node = current_node.next
51+
current_node.next = reversed_node
52+
53+
if next_node is None:
54+
return current_node
55+
56+
reversed_node = current_node
57+
current_node = next_node
58+
"""
59+
60+
61+
if __name__ == "__main__":
62+
test_cases = [
63+
([1, 2, 3, 4, 5], [5, 4, 3, 2, 1]),
64+
([1, 2], [2, 1]),
65+
([], []),
66+
]
67+
68+
solution = Solution()
69+
70+
for idx, (inp, expected) in enumerate(test_cases, start=1):
71+
head = None
72+
for value in reversed(inp):
73+
head = ListNode(value, head)
74+
75+
result = solution.reverseList(head)
76+
77+
result_list = []
78+
while result is not None:
79+
result_list.append(result.val)
80+
result = result.next
81+
82+
assert (
83+
result_list == expected
84+
), f"Test Case {idx} Failed: Expected {expected}, Got {result_list}"
85+
86+
print("All test cases passed.")

0 commit comments

Comments
 (0)