코딩테스트
[Hackerrank] Reverse a doubly linked list
essay0263
2025. 1. 20. 00:02
Doubly Linked List 뒤집기 문제 요약 (HackerRank)
문제 설명
주어진 이중 연결 리스트(Doubly Linked List)의 head 노드 포인터를 기준으로 리스트의 순서를 반대로 뒤집는 문제입니다.
즉, 각 노드의 next와 prev 포인터를 서로 교환하여 리스트의 방향을 반전시키고, 뒤집힌 리스트의 head 노드를 반환해야 합니다.
입력 형식
- 첫 번째 줄에 테스트 케이스 개수 tt가 주어집니다. (1 ≤ t ≤ 10)
- 각 테스트 케이스마다:
- 첫 번째 줄에 노드의 개수 이 주어집니다. (0 ≤ n ≤ 1000)
- 다음 n 줄에 노드의 데이터 값이 주어집니다. (0 ≤ 데이터 ≤ 1000)
출력 형식
- 뒤집힌 연결 리스트의 head 노드를 반환합니다.
- 프로그램은 리스트의 데이터를 공백으로 구분하여 출력합니다.
제약 조건
- 리스트가 비어 있을 수도 있습니다. (즉, head가 NULL일 수 있음)
- 노드의 데이터 값은 0 이상 1000 이하의 정수입니다.
문제 예시
입력:
1
4
1
2
3
4
출력:
4 3 2 1
이 문제는 바로 어제 풀었던 reverse a linked list랑 매우 유사하다. 차이점은 어제 문제는 반복문을 이용해 next node만 바꾸어주었다면, 오늘은 double linked list이니 양 쪽으로, prev node와 next node를 둘 다 바꾸어 주어야 한다. 어제와 동일하게 llist를 head node로 주니 current가 존재하는 동안 current의 next_node를 미리 저장해 두고 next와 prev node를 바꾸어주고, 그리고 prev에 current를 넣어주고 current에 next_node를 넣어주는 방식으로 문제를 풀었다.
코드는 다음과 같다.
def reverse(llist):
prev = None
current = llist
while current:
next_node = current.next
current.next = prev
current.prev = next_node
prev = current
current = next_node
return prev