노트

연결 리스트

Linked List

CS#algorithm · 연결된 개념 6개

쉽게 말하면

연결 리스트는 보물찾기 쪽지처럼 쪽지마다 '다음 쪽지는 어디'만 적혀 있는 구조예요. 맨 앞에 쪽지를 끼우거나 빼도 다른 쪽지를 옮길 필요 없이 안내만 고치면 되니 빨라요.

비유가 깨지는 곳 보물찾기처럼 5번째 쪽지로 바로 갈 수는 없어요. i번째를 찾으려면 앞에서부터 따라가야 해서 O(n)이고, 중간 삽입도 앞 노드를 먼저 찾은 다음에야 포인터만 바꿀 수 있어요.

각 노드가 값과 다음 노드를 가리키는 포인터를 가지고 사슬처럼 이어진 자료구조. 리스트는 맨 앞(Head)과 맨 뒤(Tail), 길이 정도만 기억한다. 배열과 달리 인덱스가 없다.

class Node<T> { next: Node<T> | null = null; constructor(public val: T) {} }
 
class LinkedList<T> {
  head: Node<T> | null = null
  tail: Node<T> | null = null
  length = 0
  push(val: T) {
    const node = new Node(val)
    if (!this.tail) this.head = this.tail = node
    else { this.tail.next = node; this.tail = node }
    this.length++
  }
}

배열과 비교

연산배열연결 리스트
i번째 접근O(1)O(n), 앞에서부터 따라간다
맨 앞에 추가·삭제O(n), 전부 민다O(1)
맨 뒤에 추가O(1)O(1), tail이 있으면

이중 연결 리스트

이중 연결 리스트(Doubly Linked List)는 노드가 이전 노드 포인터(prev)도 가진다. 메모리를 더 쓰는 대신 뒤에서부터 탐색할 수 있고, 맨 뒤 삭제도 O(1)이 된다(단일 연결 리스트(Singly Linked List)는 tail 바로 앞 노드를 찾으려고 처음부터 걸어야 한다). 브라우저의 뒤로·앞으로 기록, 최근 사용 순서를 관리하는 LRU 캐시에 쓴다.

자주 하는 연산: 뒤집기(포인터 세 개로 방향을 바꾸며 한 바퀴), 중간에 삽입·삭제(앞 노드를 찾은 뒤 포인터만 바꾼다). 스택과 큐를 구현하는 바탕이 되고, 해시 테이블의 충돌 처리에도 쓰인다. 복잡도 감각은 빅오 표기법.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 이진 탐색 트리

    각 노드가 자식을 최대 둘 가지고, 왼쪽 서브트리의 모든 값은 노드보다 작고 오른쪽은 크다는 규칙을 지키는 트리. 비교할 때마다 한쪽 가지를 버리므로 정렬된 데이터를 빠르게 찾고 넣을 수 있다.

  • 투 포인터

    배열이나 문자열에서 위치를 가리키는 포인터 두 개를 두고, 조건에 따라 움직여 가며 답을 찾는 패턴. 추가 메모리 없이(O(1) 공간) 중첩 반복을 한 번의 순회로 줄인다. 보통 정렬된 입력에서 쓴다.

  • 그래프

    정점(vertex, 노드)과 정점들을 잇는 간선(edge)으로 이루어진 자료구조. 트리도 그래프의 한 종류다. SNS 친구 관계, 지도와 경로, 웹 페이지 링크, 추천 시스템, 패키지 의존성처럼 "무엇과 무엇이 연결돼 있다"는 모든 것을 표현한다. 이 지식 맵도 노트를 정점, 링크를 간선으로 한 그래프다.

  • 이진 힙

    부모가 항상 자식보다 크거나(최대 힙, Max Heap) 작은(최소 힙, Min Heap) 완전 이진 트리(Complete Binary Tree). 형제끼리의 순서는 정하지 않는다. 가장 크거나 작은 값이 항상 루트에 있어 꺼내기 쉽다.

  • 우선순위 큐

    원소마다 우선순위가 있고, 들어온 순서와 상관없이 우선순위가 가장 높은 것부터 꺼내는 추상 자료형(Abstract Data Type, ADT). 같은 우선순위끼리의 순서는 보장하지 않는다. 응급실 대기 순서가 좋은 비유다.

보기 옵션