연결리스트
연결리스트는 배열처럼 순차적으로 메모리가 할당되어있는게 아니라 각 원소가 다음 원소의 주소를 가져 서로 이어지는 형태로 만들어진다.
따라서 다음과 같은 특징들이 생기는데
- k번째 원소를 변경/확인하기 위해서는 O(k)의 시간 필요
- 임의의 위치에 원소를 추가/제거하는 경우는 O(1)의 시간 필요
연결리스트 종류
- 단일 연결 리스트 : 원소가 다음 원소의 주소 가지고 있음
- 이중 연결 리스트: 원소가 다음 원소, 이전 원소의 주소를 가지고 있음, STL List가 이중 연결 리스트
- 원형 연결 리스트: 끝 원소가 처움 원소의 주소를 가지고 있음
배열과 연결리스트 차이
둘다 선형 자료구조이지만 차이점이 있다.
배열 | 연결 리스트 | |
k번째 원소에 접근 | O(1) | O(k) |
임의의 위치에 원소 추가/제거 | O(N) | O(1) |
메모리 상의 배치 | 연속 | 불연속 |
추가적으로 필요한 공간(overhead) | X | 주소값의 크기 * 원소 만큼, O(N) |
연결리스트 구현
만약 STL list를 코딩테스트에서 금지한다면 간단하게 이중 연결리스트를 구현할 수 있다.
pre: 현재 index에서의 이전 원소의 index 저장
nxt: 현재 index에서의 다음 원소의 index 저장
첫번째(0번 index)는 liist의 시작을 알려주는 노드이므로 데이터 저장을 목적으로 사용되지 않는다.
-1은 데이터가 없다, 다음/이전 원소가 없다는 뜻이다.
const int MAX = 100005;
int dat[MAX], pre[MAX], nxt[MAX];
int unused = 1;
fill(pre, pre+MAX, -1)
fill(nxt, nxt+MAX, -1)
travel 구현
void travel(){
int cur = nxt[0];
while(cur != -1){
cout << data[cur];
cur = nxt[cur];
}
}
insert 구현
void insert(int addr, int data){
data[unused] = data;
nxt[unused] = nxt[addr];
pre[unused] = pre[addr];
nxt[pre[addr]] = unused;
if(nxt[addr] != -1) pre[nxt[addr]] = unused;
unused++;
}
erase 구현
void erase(int addr){
nxt[pre[addr]] = nxt[addr];
if(nxt[addr] != -1) pre[nxt[addr]] = pre[addr];
}
STL List
https://cplusplus.com/reference/list/list/
https://cplusplus.com/reference/list/list/
difference_typea signed integral type, identical to: iterator_traits ::difference_type usually the same as ptrdiff_t
cplusplus.com
'C++' 카테고리의 다른 글
[C++]STL stack (0) | 2024.12.29 |
---|---|
[C++] STL Map (1) | 2024.12.23 |
[C++]템플릿 사용 시 파일 분할 (0) | 2024.12.23 |
[C++] 템플릿의 특수화 (0) | 2024.12.23 |
[C++] unique_ptr, shared_ptr (1) | 2024.12.23 |