정처기 감자정처기 감자
C언어자료구조

검색

검색어를 입력해 개념, 문제, 필기를 찾습니다.

C언어 연결 리스트 뒤집기 (Reverse Linked List)

코딩C언어
읽는데 7분 소요
처음 쓰인 날: 2026-05-06
마지막 수정일: 2026-05-06
조회수: —
선수학습(2개)
  • C언어 연결 리스트 (Linked List)
  • C언어 구조체 포인터

요약

C언어 연결 리스트의 순서를 거꾸로 뒤집는 in-place 알고리즘을 단계별로 알아봅니다. prev/curr/next 3포인터로 화살표 방향만 바꿔 같은 메모리에서 리스트를 반전시키는 과정을 다이어그램과 함께 추적합니다.

이 페이지는 기출 출제 이력이 없는 보충 페이지입니다
연결 리스트 뒤집기는 현재까지 정처기 실기 기출에 등장한 적이 없는 주제입니다. 핵심 기출 범위만 공부하고 싶다면 이 페이지는 건너뛰어도 됩니다. 최근 회차의 출제 범위가 점점 넓어지고 있어 어디서 나올지 예측하기 어렵기 때문에, 혹시 모를 출제에 대비해 추가한 페이지입니다.

핵심 정리

개념설명
in-place 뒤집기새 노드 없이 기존 노드의 next 값만 덮어써 방향만 반전
prev이미 뒤집힌 부분의 첫 노드 (시작 시 NULL)
curr지금 방향을 바꿀 노드 (시작 시 원래 head)
nextcurr->next의 백업, 다음 노드 주소를 잃지 않기 위함
종료 조건curr == NULL (원래 리스트 끝까지 이동)
새 head루프 종료 시점의 prev

알고리즘 개요

연결 리스트의 노드 순서를 거꾸로 바꾸는 알고리즘입니다. 새 노드를 만들지 않고 기존 노드 t1, t2, t3는 그대로 두고 각 노드 안의 next 값만 새로 덮어써서 화살표 방향을 거꾸로 바꿉니다. 값(5, 7, 11)을 서로 옮기지 않고도 화살표만 거꾸로 돌리면 결과가 같다는 점이 핵심입니다. 이를 in-place(제자리) 뒤집기라고 부릅니다.

핵심은 포인터 3개(prev, curr, next)를 한 노드씩 다음 노드로 이동시키며 curr->next를 prev 방향으로 다시 연결하는 것입니다.

포인터역할
prev지금까지 뒤집어 놓은 새 리스트의 첫 노드. 시작 시점에는 뒤집힌 노드가 하나도 없으므로 NULL. 원래 첫 노드가 새 리스트의 끝이 되어야 하므로 NULL이어야 함
curr지금 방향을 바꿀 노드
nextcurr->next를 미리 저장해 두는 임시 변수. 방향을 뒤집기 전에 다음 노드의 주소를 백업해 두는 것으로, 그렇게 안 하면 curr->next를 prev로 덮어쓰는 순간 원래 다음 노드 주소가 사라져서 그 노드에 더 이상 도달할 수 없습니다

연결 리스트 페이지에서 만든 t3 -> t2 -> t1 -> NULL 리스트를 뒤집어 t1 -> t2 -> t3 -> NULL로 만들어 봅시다.


코드

c
코드 하이라이팅 중…

prev는 NULL1로 초기화합니다. while이 한 번 돌 때마다 1 ~ 4번이 차례로 실행됩니다. 그 후 다시 curr이 NULL인지 검사해서 NULL이면 빠져나옵니다.

c
코드 하이라이팅 중…

루프가 끝났을 때 prev가 가리키고 있는 노드(&t1)가 새로운 시작점입니다. 원래 리스트의 마지막 노드 t1은 뒤집힌 리스트의 첫 노드가 됩니다. 마지막 회차에서 prev = curr = &t1이 실행된 후 루프가 끝나므로, 결과적으로 prev가 새 head를 가리키게 됩니다.


단계별 추적

루프 진입 직전 상태

반복이 시작되기 전 변수와 노드의 상태입니다. prev는 NULL, curr은 시작 노드 &t3를 가리키고, 노드 연결은 아직 원래 방향(t3 -> t2 -> t1 -> NULL) 그대로입니다. 아래 다이어그램이 그 초기 상태입니다.

연결 리스트 뒤집기 초기 상태
prev=NULL, curr=&t3. 노드 연결은 t3 -> t2 -> t1 -> NULL 그대로.

1회차 반복

curr = &t3인 상태에서 진입합니다.

  1. next = curr->next → next = &t2
  2. curr->next = prev → t3.next = NULL (원래 t3는 리스트의 첫 노드였지만, 뒤집은 결과 리스트에서는 마지막 노드가 됩니다. 그래서 t3.next를 NULL로 바꿔줍니다.)
  3. prev = curr → prev = &t3
  4. curr = next → curr = &t2

t3가 t2와 분리되고, prev가 t3로 이동합니다. 4번까지 실행한 뒤 다시 while 조건으로 돌아가 curr(=&t2)이 NULL인지 검사합니다. NULL이 아니므로 다시 1번부터 실행합니다.

연결 리스트 뒤집기 1회차 반복 후 상태
t3.next가 NULL로 바뀌어 t3가 끝 노드가 되고, prev=&t3, curr=&t2로 이동.

2회차 반복

curr = &t2인 상태에서 진입합니다.

  1. next = curr->next → next = &t1
  2. curr->next = prev → t2.next = &t3 (t2 -> t3로 방향이 뒤집힘)
  3. prev = curr → prev = &t2
  4. curr = next → curr = &t1

t2가 t3 쪽으로 다시 연결되어 지금까지 뒤집힌 부분(t2 -> t3 -> NULL)이 만들어지고, 아직 안 뒤집힌 t1이 따로 남아 있습니다.

연결 리스트 뒤집기 2회차 반복 후 상태
t2.next가 &t3가 되어 t2 -> t3 -> NULL 부분 리스트 형성, prev=&t2, curr=&t1로 이동.

3회차 반복

curr = &t1인 상태에서 진입합니다.

  1. next = curr->next → next = NULL
  2. curr->next = prev → t1.next = &t2
  3. prev = curr → prev = &t1
  4. curr = next → curr = NULL

마지막 노드 t1이 t2 쪽으로 연결되며 전체 리스트가 완성됩니다. 다음 반복 조건 while(curr)은 curr이 NULL이므로 거짓이 되어 루프가 종료됩니다.

연결 리스트 뒤집기 3회차 반복 후 상태
t1.next=&t2로 연결 완료. prev=&t1이 새 head가 되고, curr=NULL이라 루프 종료.

최종 결과

새 head = prev = &t1 → t1 -> t2 -> t3 -> NULL (값 순서: 5, 7, 11)

뒤집힌 연결 리스트 최종 상태
루프 종료 후 head 기준으로 정리한 새 리스트. head -> t1 -> t2 -> t3 -> NULL 순서로 원본의 정반대가 됩니다.

변수 변화 추적표

각 회차 4단계가 모두 끝난 직후의 변수 상태입니다. next는 매 회차 1단계에서 갱신된 후 그 회차 동안 바뀌지 않으므로, 회차 후 next 값 = 그 회차 1단계 결과입니다.

여러 부분 리스트가 동시에 존재하면 |로 구분합니다. 화살표는 모두 next 방향(가리키는 쪽)을 의미합니다.

시점prevcurrnext노드 연결 상태
진입 직전NULL&t3NULLt3 -> t2 -> t1 -> NULL
1회차 후&t3&t2&t2t3 -> NULL | t2 -> t1 -> NULL
2회차 후&t2&t1&t1t2 -> t3 -> NULL | t1 -> NULL
3회차 후&t1NULLNULLt1 -> t2 -> t3 -> NULL

자주 하는 실수

순서를 바꾸면 다음 노드를 잃어버립니다
curr->next = prev를 먼저 실행하면 원래 다음 노드 주소가 사라져서 curr를 더 이상 전진시킬 수 없습니다. 반드시 next = curr->next로 백업한 다음 방향을 뒤집으세요.
next 백업을 건너뛴 경우의 끊김
next = curr->next 백업 단계를 건너뛰고 곧바로 curr->next = prev를 실행하면, t3.next가 NULL로 덮어써져 t2와 t1으로 가는 길이 영원히 사라집니다.

연습 문제

문제를 불러오는 중이에요.
문제를 불러오는 중이에요.
문제를 불러오는 중이에요.

Footnotes

  1. 0(빈 주소)을 의미하는 매크로입니다. <stdio.h> 등 표준 헤더에 정의되어 있으며, prev = NULL은 prev = 0과 같은 뜻입니다. ↩


메가커피와 함께, 홈페이지 개선에 참여하세요! ☕
혹시 이용에 불편한 점이나 개선이 필요한 부분을 발견하셨나요? 댓글로 알려주시면 더 나은 감자가 될 수 있어요! 🥔 제보해주신 모든 분께 메가커피 기프티콘을 드립니다! (본인 이메일로 댓글 달아주셔야해요~)

관련 글

(41개)
제목태그업데이트시험
C언어 형변환 (Casting)
C언어코딩C언어
2026-05-15-
C언어 사용자 정의 함수 기초
C언어코딩C언어
2026-05-06-
C언어 sizeof 연산자
C언어코딩C언어
2026-05-06-
C언어41개
제목태그업데이트시험
C언어 형변환 (Casting)
C언어코딩C언어
2026-05-15-
C언어 사용자 정의 함수 기초
C언어코딩C언어
2026-05-06-
C언어 sizeof 연산자
C언어코딩C언어
2026-05-06-
C언어 이진 트리 (Binary Tree)
C언어코딩C언어
2026-04-24-
C언어 중첩 구조체와 포인터 접근
C언어코딩C언어
2026-04-24-
C언어 함수 포인터 (Function Pointer)
C언어코딩C언어
2026-04-24-
배열 C언어 코딩 감자시험
감자시험C언어배열감자시험
2026-03-28응시
C언어 왕감자 정보처리기사 실기 모의 시험
C언어C언어
2026-03-27응시
제어문/반복문 C언어 코딩 감자시험
감자시험C언어제어문반복문
2026-03-28응시
연산자 C언어 코딩 감자시험
감자시험C언어연산자감자시험
2026-03-28응시
포인터 C언어 코딩 감자시험
감자시험C언어포인터감자시험
2026-03-28응시
문자열 C언어 코딩 감자시험
감자시험C언어문자열감자시험
2026-03-28응시
구조체 C언어 코딩 감자시험
감자시험C언어구조체감자시험
2026-03-28응시
C언어 구조체 배열
C언어코딩C언어
2026-03-21-
C언어 구조체 포인터
C언어코딩C언어
2026-04-24-
C언어 함수 프로토타입
C언어코딩C언어
2026-03-21-
C언어 입력 함수 - scanf, getchar, gets
C언어코딩C언어
2026-03-21-
C언어 출력 함수 - putchar, printf, puts
C언어코딩C언어
2026-09-29-
C언어 문자열 포인터 (char *)
C언어코딩C언어
2026-03-21-
C언어 포인터 산술 (Pointer Arithmetic)
C언어코딩C언어
2026-03-21-
C언어 재귀함수 (Recursion)
C언어코딩C언어
2026-03-21-
C언어 선택정렬 (Selection Sort)
C언어코딩C언어
2026-02-10-
C언어 스택 (Stack) - LIFO 자료구조
C언어코딩C언어
2026-03-21-
C언어 2차원 배열
C언어코딩C언어
2026-03-21-
C언어 원형 큐 (Circular Queue)
C언어코딩C언어
2026-03-21-
C언어 ctype.h 문자 판별 함수
C언어코딩C언어
2026-03-21-
C언어 자료형
C언어코딩C언어
2026-05-15-
C언어 이중 포인터 (Double Pointer)
C언어코딩C언어
2026-03-21-
C언어 동적 메모리 할당 (malloc, free)
C언어코딩C언어
2026-05-04-
C언어 헤더 파일과 #include
C언어코딩C언어
2026-03-21-
C언어 연결 리스트 (Linked List)
C언어코딩C언어
2026-05-06-
C언어 포인터 배열과 2차원 배열
C언어코딩C언어
2026-03-24-
C언어 포인터의 기초
C언어코딩C언어
2026-06-25-
C언어 큐 (Queue) - FIFO 자료구조
C언어코딩C언어
2026-03-21-
C언어 static 변수 - 값이 유지되는 변수
C언어코딩C언어
2026-03-21-
C언어 포인터를 이용한 문자열 복사
C언어코딩C언어
2026-07-09-
C언어 문자열 뒤집기 (포인터 활용)
C언어코딩C언어
2026-03-21-
C언어 구조체
C언어코딩C언어
2026-03-20-
C언어 삼항 연산자
C언어코딩C언어
2026-03-21-
C언어 typedef - 자료형에 새 이름 붙이기
C언어코딩C언어
2026-03-21-
전설의 완전수 문제 - C언어
C언어코딩C언어
2025-09-12-
정처기 감자정처기 감자

정보처리기사 합격
도와줄라고 하는 감자

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매

실기 이론

  • 이론 공부법
  • DB
  • 네트워크/OS
  • SW 설계
  • SW 개발
  • 보안/신기술

시험 응시

  • 시험장 찾기
  • 원서 접수
  • 응시자격 서류

요약 PDF

  • 26년 3회 이론 압축
  • 26년 3회 코딩 압축
  • 초압축 25년 3회
  • 압축 25년 3회

기출문제

  • 전체 기출문제
  • 25년 3회
  • 25년 2회
  • 문제 포럼

감자 이용권

  • 이용권 구매
© 2025 재현기획개발. All rights reserved.
  • 정처기 감자의 시작
  • 업데이트 로그
  • 개인정보 처리방침
  • 이용약관
상호명 : 재현기획개발 / 주소: 서울특별시 영등포구 영등포로 150, 지하1층 108호 L145 가라지(당산동1가, 생각공장 당산) / 대표: 김재현 / 전화: 010-8158-7127 / 통신판매업신고: 제2025-서울영등포-1569호 / 이메일: contact@edugamja.com / 사업자등록번호: 573-51-00999