
서로 연관된 데이터들을 메모리에 연속적이게 저장하는 자료구조
배열은 처음에 크기를 선언해야하기 때문에 고정된 저장 공간을 가진다.
| Operation | Time |
|---|---|
| access (random) | O(n) |
| append ( capacity > size ) | O(1) |
| delete ( last ) | O(1) |
| insertion | O(n) |
| deletion | O(n) |
| search | O(n) |

Linked List는 data 와 다음 노드를 가르키는 address를 저장 하는 Node로 이어진 자료구조
address 가 다음 노드를 가르키기 때문에 논리적으로 연결되어 있음
( 배열처럼 물리적으로 메모리에 연속되어 저장되지 않고 비연속적으로 저장 됨 )
struct Node{
int data;
Node* next;
Node(int d, Node* node){
data = d;
next = node;
}
};
| Operation | Time |
|---|---|
| access | O(n) |
| search | O(n) |
| insert | O(1) |
| delete | O(1) |
삽입 삭제 시 address의 주소 값만 변경해주면 되기 때문에 빈번한 데이터의 삽입 삭제가 이루어지는 상황에서 사용하면 좋은 자료구조
( 반면, 데이터의 조회가 잦은 경우 배열을 이용하는게 좋음 )
Node* node = head;
while(node != nullptr){
cout << node->val << "-->";
node = node->next;
}
```
next address 로 head 를 가르키게 한 뒤 head 를 newNode로 변경시켜주면 됨 Node* newNode = new Node(4, nullptr);
newNode->next = head;
head = newNode;
```
newNode로 지정해주면 됨 Node* newNode = new Node(4, nullptr);
Node* tmp = head;
while(tmp->next){
tmp = tmp->next; // 노드를 맨 마지막까지 이동
}
tmp->next = newNode;
```
Node* tmp = head;
head = head->next; // 맨 앞 요소를 옮겨주면 됨
delete tmp; Node* tmp = head;
while(tmp){
tmp = tmp->next;
}
delete tmp;Array : Compile시에 고정된 크기의 메모리 할당이 이루어짐 ( Static Memory Allocation )
Linked List : Runtime에 새로운 Node를 추가할 때 마다 메모리가 할당 됨 ( Dynamic Memory Allocation )
잦은 랜덤 access와 데이터 조회에는 Array를 사용하는게 좋고
잦은 데이터의 삽입과 삭제가 일어나는 경우에는 Linked List를 사용하는게 좋다.