본 내용은 프로그래머스의 코딩테스트 광탈 방지 A to Z : JavaScript 강의를 토대로 작성하였습니다.
1. 연결 리스트란?
- 각 요소를 포인터로 연결하여 관리하는 선형 자료구조
- 각 요소는 노드라고 불리고 데이터 영역과 포인터 영역으로 구성
2. 연결 리스트의 특징
- 메모리가 허용하는한 요소를 제한없이 추가할 수 있음
- 탐색은 O(n)이 소요
- 추가와 삭제가 반복되는 로직에서 사용하면 유용
- O(1)이 소요
- Singly Linked List, Doubly Linked List, Circular Linked List
3. 배열과 차이점
- 메모리에서의 차이
- 배열은 순차적으로 요소들을 관리하므로 메모리 영역을 연속적으로 사용
- 연결 리스트는 각 데이터가 퍼져 있음
- 연결 리스트는 퍼져있는 메모리 영역을 알기 위해 포인터를 사용하여 각 영역을 참조
- 요소 삭제, 추가
- 배열의 요소 삭제 및 추가는 선형시간(O(n)) 소요
- 연결 리스트의 요소 삭제 및 추가는 상수시간(O(1)) 소요
4. Singly Linked List
- 단일 연결 리스트
- Head에서 Tail까지 단방향으로 이어지는 연결 리스트
- 가장 단순한 형태인 연결 리스트
- 헤드 포인터: 헤드를 가리키는 가장 첫번째 출발점
- Tail은 포인터 영역이 null임
요소 찾기
선형 시간(O(n)) 소요
- 헤드 포인터에서 시작
- 다음 요소인 헤드를 찾음
- 해당 요소가 찾는 요소인지 확인
- 찾는 요소가 아니라면, 포인터 영역을 통해 다음으로 이동
- 찾는 요소를 찾을 때까지 반복
요소 추가
상수 시간(O(1)) 소요
- 추가할 요소의 포인터 영역을 다음에 위치할 요소에 가르키게 만듦
- 이전에 위치할 요소의 포인터 영역을 추가할 요소를 가르키도록 만듦
- 위 과정은 추가를 하는 것만 해당
- 이전 또는 다음에 위치할 요소를 탐색하는 것은 상기대로 선형 시간이 소요되므로 주의
요소 삭제
상수 시간(O(1)) 소요
- 삭제할 요소의 이전 요소의 포인터가 삭제할 요소의 다음 요소를 가르키도록 함
- 삭제할 요소를 메모리 상에서 삭제
6. Doubly Linked List
- 이중 연결 리스트
- 양방향으로 이어지는 연결 리스트
- 포인터가 두개 있음
- 단일 연결 리스트보다 자료구조의 크기가 조금 더 큼
요소 추가
상수 시간(O(1)) 소요
- 추가할 노드의 다음 노드 포인터에 다음 노드를 가리키도록 함
- 이전 노드의 다음 노드 포인터에 추가할 노드를 가리키도록 함
- 다음 노드의 이전 노드 포인터에 추가할 노드를 가리키도록 함
- 추가할 노드의 이전 노드 포인터에 이전 노드를 가리키도록 함
요소 삭제
상수 시간(O(1)) 소요
- 이전 노드의 다음 노드 포인터가 삭제할 노드의 다음 노드를 가리키도록 함
- 다음 노드의 이전 노드 포인터가 삭제할 노드의 이전 노드를 가리키도록 함
- 삭제할 노드를 메모리에서 삭제
7. Circular Linked List
- 환형 연결 리스트
- Tail이 head로 연결되는 연결 리스트
- 메모리를 절약할 수 있음
- 원형 큐 등을 만들 때 사용
- 중간에서 탐색을 시작하더라도 한 바퀴를 돎
Reference
'programming study > Computer Science' 카테고리의 다른 글
자료구조와 알고리즘 - 큐 (0) | 2022.09.14 |
---|---|
자료구조와 알고리즘 - 스택 (0) | 2022.09.13 |
자료구조와 알고리즘 - 객체 (0) | 2022.09.11 |
자료구조와 알고리즘 - 배열 (0) | 2022.09.10 |
자료구조와 알고리즘 - 자료구조와 알고리즘이란, 자료구조의 종류, 시간 복잡도 (0) | 2022.09.09 |