출처 : https://www.youtube.com/watch?v=K1PlysPgNZY&t=20s
1. 선형 구조란?
- 자료 구조의 분류
구조 | 설명 | 종류 |
---|
선형 구조 | 데이터를 연속적으로 연결한 자료 구조 | 리스트, 스택, 큐, 데크 |
비선형 구조 | 데이터를 비연속적으로 연결한 자료 구조 | 트리, 그래프 |
- 리스트
2. 연결리스트란?
개념
- 연속된
노드(Node)
의 연결체
- 데이터를 감싼 노드를 포인터로 연결해서 공간적인 효율성을 극개화시킨 자료 구조
노드(Node)
- 연결리스트에서 사용되는 하나의 데이터 덩어리이며,
데이터 & 링크
이 2가지의 필드를 담고 있는 구조
- data : 노드가 담고 있는 데이터/값, 문자열, 숫자 등등 원하는 값을 넣고 저장
- next : 링크/ 포인터 역할, 다음 노드의 주소를 저장
- 양방향 연결 리스트의 경우
prev 포인터(이전 노드의 주소)
추가
연결 리스트의 구조
- 마지막 연결할 것은 없기에 null과 연결
- 연결리스트의 첫 번째 즉, 시작 지점에 있는 것을
head
라고 함
- 연결리스트의 마지막은
tail
라고 부름
배열 vs 연결리스트
배열
- 배열은 메모리 공간 안에 모든 원소들이 이어진 공간에 자리 잡음
- 인덱스를 통해 원소 탐색을 효율적으로 빠르게 실행 가능
- random access 가능 : 배열의 n번째 원소 방문 시
O(1)
시간으로 가능 EX. arr[3]
- 원소 삽입 & 삭제 일반적으로
O(N)
시간 소요 ⇒ 원소 개수 대로 늘어남
연결리스트
- 이어진 메모리 공간이 아닌 불특정한 공간에 존재
- 그렇기 때문에 포인터, 주소를 참조하는 것을 통해 연결
- 노드의 탐색은 선형시간이 걸림
- c를 가려면 a, b를 거쳐 감
random access
불가능 : 리스트의 n번째 노드 방문 시 O(N)시간 소요 ⇒ head 노드부터 n번째 노드까지 순회
- 상황에 따라 배열보다 빨라질 수 있는 노드 삽입 & 삭제
- 연결리스트의 노드를 맨 앞에 삽입 시켜줄 때는 head 노드의 참조위치만 달라지기 때문
O(1)
처리 가능
연결리스트의 종류
Singly Linked List(단일 연결 리스트)
- 대부분의 연결리스트의 문제의 주력
- 다음 노드에 대한 포인터만 가지고 있다
- 일방향이다.
Doubly Linked List(이중 연결 리스트)
- 다음 노드에 대한 포인터와 이전 노드를 가르치는 포인터를 가지고 있다.
- 앞 뒤로 탐색하는 게 빠르다는 장점이 있지만, 노드마다 2개의 포인터를 가져야 해서 데이터의 구조와 흐름이 복잡해질 수 있음
Circular Linked List(원형 연결 리스트)
- 이중연결리스트와 같지만 마지막 노드의 next 포인터가 헤드 노드를 가르친다.
연결리스트 구현 방법
노드의 구현 방법
class Node{
constructor(data){
this.data = data;
this.next = null;
}
}
연결리스트
let head = new Node("a");
head.next = new Node("b");
head.next.next = new Node("c");
head.next.next.next = new Node("d");
- 시작점 : head 변수에 새로운 노드를 a라는 변수와 함께 생성
- head라는 노드에 next라는 참조 포인터를 새로 생성할 노드 b로 지정
- 노드 b를 새로 생성한 노드 c로 지정
- 마지막 노드 지정