연결 리스트

🔥 매회 출제 (priority 3)

🌱 왜 배우나

꽉 찬 줄의 맨 앞에 한 명을 끼워 넣으려면 뒤에 서 있던 모든 사람이 한 칸씩 움직여야 한다. 배열(값을 한 줄로 나란히 저장하는 방식)이 딱 이 모습이다. 중간에 뭔가를 넣거나 빼려면 뒤 데이터를 전부 밀어야 하니 느리다.

연결 리스트는 다른 방법을 쓴다. 값 옆에 “다음 친구는 저기 있어”라는 쪽지를 붙여 두는 것이다. 값이 메모리(컴퓨터가 값을 저장해 두는 공간) 여기저기에 흩어져 있어도, 쪽지만 따라가면 순서대로 읽을 수 있다. 새 값을 끼우거나 뺄 때도 쪽지 두 장만 고쳐 쓰면 된다.

📖 핵심 개념

연결 리스트(Linked List)는 노드를 포인터로 이어 붙인 자료구조다. 자료구조란 데이터를 저장하고 꺼내는 방식을 말한다.

노드는 값 하나를 담는 칸이다. 포인터는 “다음 노드가 어디에 있는지”를 적어둔 주소표 같은 것이다. 메모리가 연속될 필요가 없다.

삽입과 삭제는 쪽지(포인터) 몇 개만 바꿔 쓰면 된다. 그래서 O(1)로 끝난다. O(1)은 데이터가 아무리 많아도 걸리는 시간이 일정하다는 뜻이다. 반대로 “n번째 값을 꺼내줘”는 처음부터 쪽지를 하나씩 따라가야 한다. 그래서 O(n)이 걸린다. n은 데이터 개수다.

시험에서는 C 구조체(여러 값을 묶어 하나의 타입처럼 다루는 문법)와 포인터로 된 코드를 주고, 순회 결과를 묻는다. 순회란 처음부터 끝까지 차례로 방문하는 동작이다.

🔍 시각화

단일 연결 리스트 구조:

head
  │
  ▼
┌──────┐    ┌──────┐    ┌──────┐    ┌──────┐
│ 데이터│    │ 데이터│    │ 데이터│    │ 데이터│
│  35  │    │  42  │    │  11  │    │  21  │
├──────┤    ├──────┤    ├──────┤    ├──────┤
│ next ─┼───▶│ next ─┼───▶│ next ─┼───▶│ next ─┼───▶ NULL
└──────┘    └──────┘    └──────┘    └──────┘
  노드1       노드2       노드3       노드4

맨 앞에 새 노드 삽입:

  ┌──────┐
  │  새  │
  │  5   │
  ├──────┤
  │ next ─┼──┐
  └──────┘  │    head 가 여기를 가리키도록 변경
            ▼
         기존 노드1 → 노드2 → ...

↔️ 이웃 개념 구분

  • 배열 vs 연결 리스트: 배열은 번호로 바로 꺼내서 조회가 빠름. 연결 리스트는 쪽지를 따라가야 해서 조회는 느리지만 삽입·삭제가 빠름.
  • 단일 vs 이중 연결 리스트: 단일은 앞→뒤 한 방향. 이중은 앞↔뒤 양방향으로 움직일 수 있음.

🔑 핵심 용어

  • 노드(Node): 값 한 칸. 데이터와 “다음 노드의 주소(next 포인터)“를 함께 담는다
  • head: 리스트의 시작점. 첫 노드를 가리키는 포인터
  • : 포인터로 구조체 안의 값을 꺼내는 연산자. p->data(*p).data와 같다
  • 단일 연결 리스트(Singly Linked List): next 한 방향으로만 이동
  • 이중 연결 리스트(Doubly Linked List): prev(이전)와 next(다음) 양쪽으로 이동
  • 원형 연결 리스트(Circular Linked List): 마지막 노드의 next가 다시 head를 가리켜 고리 모양으로 연결

✅ 스스로 가르쳐보기

연결 리스트를 처음 들어보는 친구에게 설명한다면 어떻게 말하시겠어요? 일상 속 물건이나 장면에 빗댄 본인만의 비유로 한 문장 정의를 만들어 보세요.

체크포인트 — 아래를 말로 풀어 설명할 수 있는지 확인해 보세요.

  • 배열과 연결 리스트의 삽입·삭제 속도가 왜 다른지
  • p = p->next가 포인터를 따라간다는 말이 실제로 무슨 동작인지
  • 맨 앞에 끼워 넣을 때 newNode->next = head를 먼저 해야 하는 이유
  • 순회가 NULL 에서 멈추는 이유

🎯 기출 포인트

  • 2025-1회: C 연결 리스트 순회 코드 추적. 출력 결과 35421 (노드 data 순서대로)
  • 2025-2회: 연결 리스트 삽입 후 순회. 출력 3 1 2. 포인터 재연결 순서를 잘 따라가야 한다
  • 2024-2회: 구조체 포인터 + 연결 리스트 혼합 신유형. -> 와 역참조 * 구분이 관건
  • 주의: next 포인터가 재할당되는 순서를 반드시 한 줄씩 추적한다

🔗 연결 개념