문제
다음 C 코드의 출력 결과로 가장 적절한 것은?
C#include <stdio.h> #include <stdlib.h> typedef struct Data { int value; struct Data *next; } Data; Data* insert(Data* head, int value) { Data* new_node = (Data*)malloc(sizeof(Data)); new_node->value = value; new_node->next = head; return new_node; } Data* reconnect(Data* head, int value) { if (head == NULL || head->value == value) return head; Data *prev = NULL, *curr = head; while (curr != NULL && curr->value != value) { prev = curr; curr = curr->next; } if (curr != NULL && prev != NULL) { prev->next = curr->next; curr->next = head; head = curr; } return head; } int main() { Data *head = NULL, *curr; for (int i = 1; i <= 5; i++) head = insert(head, i); head = reconnect(head, 3); for (curr = head; curr != NULL; curr = curr->next) printf("%d", curr->value); return 0; }
① 35421 ② 12345 ③ 54321 ④ 34521
정답
1번
해설
정답: 1. insert는 새 노드를 head 앞에 붙이므로 최초 리스트는 5→4→3→2→1이다. reconnect(head, 3)은 값 3 노드를 맨 앞으로 옮기므로 3→5→4→2→1이 된다.
오답 풀이
- 1번: 연결 리스트 삽입 순서와 재연결 결과가 맞다.
- 2번: 뒤에 삽입되는 방식으로 착각한 값이다.
- 3번: reconnect 수행 전 리스트이다.
- 4번: 4와 5의 순서를 잘못 계산한 값이다.
보충 개념 단일 연결 리스트에서 노드를 앞으로 이동하려면 이전 노드의 next를 현재 노드 다음으로 바꾸고, 현재 노드의 next를 기존 head로 연결해야 한다.