💡 PS
[Algorithm] 연결 리스트
date
Jul 19, 2023
slug
linked-list
author
status
Public
tags
알고리즘
summary
연결 리스트 기본 설명 및 구현 코드에 대한 포스팅입니다.
type
Post
thumbnail
category
💡 PS
updatedAt
Jul 24, 2023 07:51 AM
언어
연결 리스트
메모리 풀 방식으로 구현한 연결 리스트 : 사용될 노드를 한 번에 모두 할당한 다음, 필요할 때마다 하나씩 꺼내 쓰는 방식
장점
- 동작 할당을 하는 오버헤드가 없어짐
- 사용이 끝날 때마다 (ex. 여러개의 test case가 있는 경우) 메모리를 해제할 필요가 없음
- 모든 노드가 메모리 상에서 뭉쳐 있기 때문에 캐시 효율 높아짐
실제 프로그램을 개발할 땐 동적 할당을 써야 되겠지만 (애초에 MAX_NODE 크기를 모르니), 알고리즘 문제를 풀 때는 정적 할당을 쓰는 것이 수행 시간에 있어 유리하다.
관련 코드
constexpr size_t MAX_NODE = 100000; struct Node { int data; Node* next; }; int nodeCount = 0; Node linkedList[MAX_NODE]; // 더미 노드 head를 사용하면 연결 리스트에 원소가 최소 1개는 있기 때문에 삽입/삭제 과정에서 리스트가 비어 있을 경우를 생각하지 않아도 됨 Node head; Node* new_node(int data) { linkedList[nodeCount].data = data; linkedList[nodeCount].next = nullptr; return &linkedList[nodeCount++]; } void init() { head.next = nullptr; } // 삽입 O(1). 리스트 맨 앞에 data 추가 void insert(int x) { Node *node = new_node(x); node->next = head.next; head.next = node; } // 삭제 O(N). 리스트에서 data를 찾아서 삭제 void remove(int x) { Node* prev_ptr = &head; while(prev_ptr->next != nullptr && prev_ptr->next->data != x) { prev_ptr = prev_ptr->next; } if (prev_ptr->next != nullptr) { // 삭제할 노드가 NULL이 아닌 경우 prev_ptr->next = prev_ptr->next->next; // 삭제할 노드의 이전 노드가 삭제할 노드의 다음 노드를 가리키게 함 } } // 탐색 O(N). 리스트에 data 값이 있는지 반환하는 코드 bool find(int x) { Node* ptr = head.next; while(ptr != nullptr && ptr->data != x) { ptr = ptr->next; } return ptr != nullptr; }