일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- SSAFY 화이팅
- 우유아야
- HAVE A GOOD DAY
- 코로나 싫어요
- have a nice day
- 우유가옆으로넘어지면아야
- SSAFY IM/A
- LeetCode #릿코드 #좋은 하루 되세요 #Have a nice day
- DP
- amazon
- Hamming weight
- DFS
- SeongSeobDang
- 네트워크
- 자료구조
- 아자아자 화이팅
- BFS
- 우유가 옆으로 넘어지면 아야
- Java 환경 설정
- 텐션 업 10기!
- I am Korean
- Have a good day :)
- SSAFY 테스트
- Have a nice day.
- 텐션 업 10기 화이팅
- 모르고리즘
- 수학
- 자고 싶다
- SSAFY 10기 화이팅
- Today
- Total
Hope Everyone Is Happy
1. 연결 리스트 (Linked List) & 배열 (Array) 본문
본 게시글은 책 : 면접을 위한 CS 전공지식 노트 (출판사 : 길벗, 주홍철 지음) 을 참조하여 작성하였습니다. + 구글링
*선형 자료 구조 : 요소가 일렬로 나열되있는 자료구조
◆ 연결 리스트 (Linked List)
- 연결리스트는 데이터를 감싼 노드를 포인터로 연결해서 공간적인 효율성을 극대화 시킨 자료구조
- head 노드 에서 시작되어 tail 노드로 끝나는 구조
- 삽입과 삭제에 O(1), 탐색에는 O(n) 소요
- 싱글 연결 리스트 (Single Linked List)는 노드가 한방향으로 연결되어 있는 연결리스트
: next포인터로 다음 노드로 연결
ex)
struct ListNode {
int nData;
ListNode* next;
}
int main(){
ListNode* FirstNode;
FirstNode->nData = 4;
ListNode* SecondNode;
SecondNode->nData = 5;
SecondNode = FirstNode->next;
cout << FirstNode->next << endl; // 5출력
return 0;
}
- 이중 연결 리스트 (double Linked List)는 노드가 양방향으로 연결되어 있는 연결리스트
: next포인터로 다음 노드, prev로 이전 노드 연결
struct ListNode {
int nData;
ListNode* next;
ListNode* prev;
}
int main(){
ListNode* FirstNode;
FirstNode->nData = 4;
ListNode* SecondNode;
SecondNode->nData = 5;
FirstNode = SecondNode->prev;
SecondNode = FirstNode->next;
ListNode* ThirdNode;
ThirdNode->nData = 6;
SecondNode = ThirdNode->prev;
ThirdNode = SecondNode->next;
cout << FirstNode->next << endl; // 5출력
cout << ThirdNode->prev << endl; // 5출력
return 0;
}
- 원형 이중 연결 리스트 (circular linked list) : 이중 연결리스트와 같지만 마지막 노드의 next 포인터가 헤드 노드를 가리킴
◆ 배열 (Array)
- 연배열은 같은 타입의 변수들로 이루어져 있고, 크기가 정해져 있으며, 인접한 메모리 위치에 있는 데이터를 모아놓은 집합
- 중복을 허용하고 순서 존재
- 탐색에 O(1)이 되어 랜덤접근 (Random access)이 가능
- 삽입과 삭제에는 O(n) 소요
- 데이터 추가와 삭제를 많이 하는 것은 연결 리스트, 탐색을 많이 하는 것은 배열로 하는 것이 유용
- 직접 접근이라고 하는 랜덤 접근은 동일한 시간에 배열과 같은 순차적인 데이터가 있을 때 임의의 인덱스에 해당하는 데이터에 접근할 수 있는 기능
- 데이터를 저장된 순서대로 검색해야 하는 순차적 접근과는 반대
- 배열 vs 연결 리스트
: 연결 리스트에서의 삽입 삭제는 노드 연결을 끊거나 이으면 끝
: 배열은 삽입, 삭제의 경우 공간 재배치 필요로 링크드 리스트에 비해 비효율적
: 연결 리스트에서의 탐색은 순서를 알고 있어도 head에서 부터 많은 양의 이동이 필요
: 배열의 순서를 알고있다면 해당 순서로 바로 탐색 가능
ex )
struct ListNode {
int nData;
ListNode* next;
ListNode* prev;
}
using namespace std;
int main(){
// 배열
int arr[100];
arr[0] = 4;
arr[1] = 5;
arr[2] = 6;
// 링크드 리스트
ListNode* FirstNode;
FirstNode->nData = 4;
ListNode* SecondNode;
SecondNode->nData = 5;
FirstNode = SecondNode->prev;
SecondNode = FirstNode->next;
ListNode* ThirdNode;
ThirdNode->nData = 6;
SecondNode = ThirdNode->prev;
ThirdNode = SecondNode->next;
// 링크드 리스트에서의 데이터 추가
ListNode* RandomNode;
RandomNode->nData = 7;
FirstNode = RandomNode->prev;
ThridNode = RandomNode->next;
// 배열에서의 데이터 추가
int nTemp = 7;
arr[3] = arr[2];
arr[2] = arr[1];
arr[1] = nTemp;
// 링크드 리스트에서 데이터 6 찾기
ListNode* TempNode = FirstNode;
while(TempNode->Data != 6) {
TempNode = TempNode->next;
}
cout << TempNode->Data << endl;
// 배열에서 데이터 6찾기
for(int i =0; i < 4; i++) {
if(arr[i] == 6)
cout << arr[i] << endl;
}
return 0;
}
Linked List 릿코드의 추억..
위의 글과 관련하여 추가적인 내용이나 피드백은 언제나 환영입니다 :)
'※ CS 스터디 > 자료구조' 카테고리의 다른 글
5. 트리 (Tree) (0) | 2023.08.15 |
---|---|
4. 그래프 (Graph) (0) | 2023.08.15 |
3. 스택 (Stack) & 큐 (Queue) (0) | 2023.08.09 |
2. 벡터 (vector) (0) | 2023.08.09 |
0. 시간 복잡도 & 공간 복잡도 (0) | 2023.08.09 |