CS/자료구조
자료구조: 연결 리스트(Linked List)
나디아 Nadia
2025. 5. 12. 23:16
연결 리스트(Linked List)
: 데이터를 분산된 메모리 공간에 저장하고 이들을 서로 연결한 자료구조
- 연결 리스트는 첫 노드의 주소만 알고 있으면 다른 모든 노드에 접근할 수 있음
- 배열의 단점을 해결하기 위해 고안된 구조
- 배열의 단점
- 연속된 메모리 공간이 필요함
- 초기에 크기를 정해야 하기 때문에, 메모리가 낭비될 수 있음
⇒ 저장하려는 데이터들을 메모리 공간에 분산해서 할당하고, 이들을 서로 연결해주면 됨
⇒ 노드(Node)를 만들어 연결하여 사용
- 배열의 단점
노드(Node)
: 데이터와 다음 노드의 주소를 함께 저장하는 연결 리스트의 기본 단위
노드의 구조
- 데이터를 담는 변수 1개 + 다음 노드를 가리키는 변수 1개로 구성
- 데이터가 필요할 때마다 새로운 노드를 만들어서 데이터를 저장하고, 다음 노드를 가리키는 방식으로 연결함
⇒ 이런 구조이기 때문에 연결 리스트라고 부름
연결 리스트의 장단점
장점
- 배열처럼 초기에 크기를 정할 필요가 없음
→ 데이터를 추가할 때는 빈 메모리 아무 곳에 데이터를 생성하고 연결만 해주면 됨 - 중간에 데이터를 삽입할 때, 포인터(가리키는 다음 노드)만 바꿔주면 되므로 삽입이 간단함
↔ 배열은 중간 삽입 시 모든 데이터가 밀려나므로 오버헤드 발생
단점
- 데이터들이 전부 떨어져 있어서 원하는 데이터에 바로 접근할 수 없음
→ 원하는 데이터를 찾으려면 처음부터 차례로 탐색해야 함
- ex) 4번째 데이터를 찾으려면 ⇒ 1번 노드에서 다음 노드 찾기 → 2번 노드에서 다음 노드 찾기 → 3번 노드에서 다음 노드 찾기 → 4번 데이터 찾음
배열과 연결 리스트 비교
배열 | 연결 리스트 | |
크기 | 고정 | 동적 (데이터가 필요할 때마다 노드를 만들어서 연결) |
할당 주소 | 연속된 공간에 할당 | 불연속된 공간에 할당 (힙 영역에 런타임 중에 할당) |
데이터 참조 | 빠름 (O(1)) | 느림 (O(n)) (앞에서부터 해당 노드까지 접근해야 함) |
삽입/삭제 | 느림 (O(n)) (기존의 모든 데이터를 옮겨야 함) |
느림 (O(n)) (삽입하려는 노드까지 노드를 계속 타고 들어가야 함) |
추상 자료형(Abstract Data Type)
: 어떤 데이터와 그 데이터를 연산하는 기능을 표기하는 것을 말함
- ex) 세탁기라는 기계에 옷(데이터)을 넣고 빨래(연산 기능)를 함
→ 사용자는 세탁기의 내부 동작을 몰라도 빨래 기능을 사용할 수 있음
→ 즉, 데이터 구조의 세부 구현을 숨기고 기능(연산)만을 외부에 제공하는 방식
연결 리스트의 추상 자료형
- 연결 리스트는 노드(Node)라는 단위로 데이터를 저장하고, 각 노드는 다음 노드를 가리킴
- 여기서는 데이터를 정수형으로 가정함
printAll() | 연결 리스트의 모든 데이터 출력 → 리스트의 처음부터 끝까지 순차적으로 탐색하면서 모든 데이터를 출력함 |
clear() | 연결 리스트의 모든 데이터 제거 → 연결 리스트를 비워 초기 상태로 만들고, 모든 노드를 순회하며 삭제함 |
insertAt(index, data) | 원하는 인덱스의 데이터 삽입 → 지정한 위치에 새 데이터를 삽입, 삽입 지점 전까지 노드를 탐색해야 함 |
insertLast(data) | 마지막 데이터 뒤의 데이터 삽입 → 리스트의 마지막에 새로운 데이터를 추가, insertAt으로도 가능하지만 비효율적일 수 있음 |
deleteAt(index) | 원하는 인덱스의 데이터 삭제 → 지정한 위치의 노드를 삭제, 인덱스까지 순차적으로 탐색 필요 |
deleteLast() | 마지막 데이터 제거 → 리스트의 끝에 있는 노드를 삭제, 마지막 직전 노드까지 탐색해야 함 |
getNodeAt(index) | 원하는 인덱스의 데이터를 읽는 기능 → 해당 인덱스 위치의 데이터를 반환, 순차 접근 필요 |