Post

자료구조 기초 - 연결 리스트(Linked List)

자료구조의 가장 기초인 연결 리스트(Linked List)에 대해 구조, 시간복잡도 등을 정리한 글입니다.

자료구조 기초 - 연결 리스트(Linked List)

연결 리스트란?

배열은 연속된 공간에 데이터를 저장하지만, 연결 리스트는 데이터를 떨어진 공간에 저장하면서 서로 연결해두는 자료구조입니다.

말 그대로 데이터가 연결(link)되어 있는 리스트(list)입니다.

연결 리스트의 구조

연결 리스트는 노드(Node) 라는 단위로 구성됩니다. 각 노드는 두 가지 정보를 가집니다:

  • 데이터(Data): 실제 저장할 값
  • 다음 노드를 가리키는 포인터(Next)
1
[Data|Next] -> [Data|Next] -> [Data|Next] -> None

이런 구조 덕분에 연결 리스트는 데이터를 어디서든 쉽게 추가하거나 제거할 수 있습니다.

연결 리스트의 종류

  1. 단일 연결 리스트(Singly Linked List): 한 방향으로만 연결되어 있습니다.
  2. 이중 연결 리스트(Doubly Linked List): 앞뒤로 모두 연결되어 있어 양방향 이동이 가능합니다.
  3. 원형 연결 리스트(Circular Linked List): 마지막 노드가 처음 노드를 가리켜서 원처럼 연결되어 있습니다.

연결 리스트 예시 (Python)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
            return
        cur = self.head
        while cur.next:
            cur = cur.next
        cur.next = new_node

연결 리스트의 시간복잡도

작업시간복잡도설명
접근 (Access)O(n)인덱스로 접근이 불가능하므로 처음부터 차례대로 찾아야 합니다.
검색 (Search)O(n)원하는 데이터를 찾을 때도 처음부터 하나씩 확인해야 합니다.
삽입 (Insert)O(1)*삽입 위치의 노드를 알고 있다면 바로 연결만 하면 됩니다.
삭제 (Delete)O(1)*삭제할 노드를 알고 있다면 포인터만 끊으면 됩니다.

삽입 또는 삭제하려는 위치를 알고 있다는 전제 하에서 빠르게 동작할 수 있습니다.

배열과 연결 리스트 비교

항목배열연결 리스트
메모리 구조연속적비연속적 (포인터로 연결)
접근 속도빠름 (O(1))느림 (O(n))
삽입/삭제느림 (O(n))빠름 (O(1), 위치 알고 있을 때)
크기 조절어려움자유로움

실생활 예시로 이해하기

사슬체인

연결 리스트는 사슬 체인과 비슷합니다. 각각의 고리가 하나의 노드이고, 고리 사이를 연결하는 고리가 포인터 역할을 합니다. 중간에 새로운 고리를 끼우거나 기존 고리를 제거할 때, 전체를 다시 만들 필요 없이 연결만 바꾸면 되기 때문에 구조 변경이 매우 유연합니다.

마무리 정리

항목연결 리스트
데이터 접근느림 (O(n)) - 인덱스로 직접 접근이 불가능하여 처음부터 순차 탐색이 필요합니다.
삽입/삭제빠름 (O(1), 특정 위치 알고 있을 때) - 포인터 연결만 바꾸면 되므로 효율적입니다.
크기 조절자유로움 - 노드를 추가하거나 제거하면서 구조를 쉽게 변경할 수 있습니다.
검색 효율낮음 - 원하는 데이터를 찾을 때 선형 탐색이 필요하여 시간이 오래 걸릴 수 있습니다.
구현 복잡도비교적 높음 - 포인터를 다루어야 하므로 구현이 배열보다 어렵습니다.
This post is licensed under CC BY 4.0 by the author.