자료구조란 쉽게 말해, 데이터를 저장하고 사용하기 위해 만드는 것이다.
세 가지 기본기능으로는 탐색(Search), 삽입(Insert), 삭제(Delete)가 있다.
자료구조는 구현방법과 성능분석이 중요하다.
링크드 리스트의 특징 (배열과 비교)
- 배열은 주소가 연속적이지만, 링크드 리스트는 주소가 연속적이지 않다.
- 배열은 크기가 고정이므로 공간이 부족하거나 낭비될 수 있지만, 링크드 리스트는 크기가 가변적이므로 부족, 낭비가 없다.
- 배열에 비해 접근이 느리고 구현도 어렵다.
단일 링크드 리스트
- 단일 링크드 리스트는 node가 순차적으로 이루어져 있다.
- 각 노드는 값을 나타내는 element 부분과 다음 node를 가리키는 주소(포인터)로 구성된다.
- 맨 앞 노드를 Head라고 가리키고 맨 뒤 노드를 Tail이라고 한다.
헤드에 삽입(Insert)하기
- 새로운 노드를 할당한다.
- element, 값을 노드에 삽입한다.
- 원래 head였던 node의 주소를 노드에 삽입한다.
- head가 새로 만들어진 노드를 가리키도록 한다.
-> ∴ O(1) Time이 소요된다.
헤드에서 삭제(Delete)하기
- head가 현재 head의 다음 노드를 가리키도록 한다.
- garbage Collector가 노드를 수거하도록 한다.
2번의 예시 코드는
node* tmp;
tmp = this->head;
this->head = head->next;
free(tmp); // delete tmp;
-> ∴ O(1) Time이 소요된다.
테일에 삽입(Insert)하기
- 새로운 노드를 할당한다.
- element, 값을 노드에 삽입한다.
- 노드가 null을 가리키도록 한다.
- 원래 tail인 노드가 새 노드를 가리키도록 한다.
- tail이 새 노드를 가리키도록 한다.
-> ∴ O(1) Time이 소요된다. (처음부터 tail까지 갈 필요 없이, tail에 이미 마지막 노드를 저장해 두었기 때문이다.)
테일에서 삭제(Delete)하기
- 단일 링크드 리스트에서는 바로 이전 노드의 주소를 알아내기가 어렵다. (주소가 배열과 달리 연속적이지 않기 때문이다.)
- 반복문을 사용해서 head에서부터 찾으면 가능하다. 이를 이용해서 tail 바로 이전의 node를 찾아서 삭제를 진행하면 된다. 이 경우, 시간낭비가 심해진다.
-> ∴ O(n) Time이 소요된다.
링크드 리스트에서의 탐색
head에서부터 찾아야 하므로 O(n) Time이 소요된다.
'CS > 자료구조' 카테고리의 다른 글
List, Set, Map 각각의 특성 (1) | 2022.05.23 |
---|---|
[자료구조]3. 큐 (0) | 2021.07.28 |
[자료구조]2. 스택 (0) | 2021.07.19 |