CS
[์๋ฃ๊ตฌ์กฐ] ๋งํฌ๋๋ฆฌ์คํธ (Linked list)
moaoh
2024. 10. 30. 18:01
๋งํฌ๋๋ฆฌ์คํธ (Linked list) ๋?
- ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ฐ ๋ ธ๋๊ฐ ๋ฐ์ดํฐ์ ๋ค์ ๋ ธ๋์ ์ฃผ์๋ฅผ ํฌํจํ์ฌ ์์ฐจ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ์๋ฃ๊ตฌ์กฐ
- ๋์ ์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
๊ธฐ์กด์ ์ผ๋ก๋ ํ์ฌ์ ๋
ธ๋๊ฐ ๋ค์ ๋
ธ๋๋ง์ ์ฐธ์กฐํ๋ ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Singly Linked List) ๋ถํฐ
์ด์ ๋
ธ๋์ ๋ค์ ๋
ธ๋ ๋ชจ๋๋ฅผ ์ฐธ์กฐํ๋ ์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Doubly Linked List) ๋ฑ์ผ๋ก ๋ค์ํ๊ฒ ํ์ฅ์ด ์ด๋ฃจ์ด์ง ์ ์๋ค.
์ฅ๋จ์
์ฅ์
- ๋์ ์ผ๋ก ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
- ๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ์ฝ์ ์ญ์ ์ ์ฉ์ดํ๋ค.
๋จ์
- ์์์ ์ผ๋ก ํน์ ๋ฐ์ดํฐ์ ์ ๊ทผ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ๋ ๋ค.
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Singly Linked List)
์ฅ์ :
- ๊ฐ ๋ ธ๋๊ฐ ๋ค์ ๋ ธ๋๋ง์ ์ฐธ์กฐ๋ next๋ง ๊ฐ์ง๊ณ ์๊ธฐ๋๋ฌธ์ ์๋ฑกํฅ์ ๋นํด ๋ฉ๋ชจ๋ฆฌ์ฌ์ฉ๋์ด ์ค์ด๋ ๋ค.
- ๋ ธ๋ ์ฝ์ ๊ณผ ์ญ์ ๊ฐ ๋น๊ต์ ๋จ์ํ๊ณ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๋ค.
๋จ์ :
- next๋ง ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ๋ ธ๋์์ ๋ค์ ๋ ธ๋๋ก๋ง ์ด๋์ด๊ฐ๋ฅํ๊ณ ์ด์ ๋ ธ๋๋ก๋ ์ด๋์ด ๋ถ๊ฐ๋ฅํ๋ค.
์๋ฐฉํฅ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Doubly Linked List)
์ฅ์ :
- prev ํฌ์ธํฐ๊ฐ ์์ด, ๋ฆฌ์คํธ์ ์ด๋ ์์น์์๋ ์๋ค๋ก ์ฝ๊ฒ ์ด๋ํ ์ ์๋ค.
- ์์ชฝ ๋ฐฉํฅ์ผ๋ก ์ํ๊ฐ ํ์ํ ๊ฒฝ์ฐ ์ ํฉํ๋ค.
๋จ์ :
- next์ prev ํฌ์ธํฐ๋ฅผ ๋ชจ๋ ์ ์งํด์ผ ํ๋ฏ๋ก, ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋นํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๋ค.
- ์ฝ์ ๊ณผ ์ญ์ ์ next์ prev๋ฅผ ๋ชจ๋ ์ ๋ฐ์ดํธํด์ผ ํ๋ฏ๋ก, ์ฝ๋๊ฐ ๋ ๋ณต์กํ๋ค.
๊ตฌํ
#include <list> ์ฌ์ฉ
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> myList;
myList.push_back(1);
myList.push_back(2);
myList.push_back(3);
myList.push_back(4);
myList.push_back(5);
// push_back
myList.push_back(6);
// pop_front
myList.pop_front();
// front & back
cout << "Front: " << myList.front() << ", Back: " << myList.back() << "\n"; // output : Front: 2, Back: 6
// reverse
myList.reverse();
// ์ถ๋ ฅ
for (auto value : myList) {
cout << value << " "; // output : 6 5 4 3 2
}
return 0;
}
Doubly Linked List ๊ตฌํ
#ifndef DOUBLYLINKEDLIST_HPP_
#define DOUBLYLINKEDLIST_HPP_
#include <iostream>
#include <vector>
class Node
{
public:
int data;
Node *next;
Node *prev;
Node(int value) : data(value), next(nullptr), prev(nullptr) {}
~Node() {}
};
class DoublyLinkedList
{
private:
Node *head;
Node *tail;
public:
DoublyLinkedList() : head(nullptr), tail(nullptr) {}
~DoublyLinkedList() {}
void push_back(int value) {
Node *newNode = new Node(value);
if (tail == nullptr) {
head = tail = newNode;
}
else {
tail->next = newNode;
newNode->prev = tail;
tail = newNode;
}
}
void push_front(int value) {
Node *newNode = new Node(value);
if (head == nullptr) {
head = tail = newNode;
}
else {
newNode->next = head;
head->prev = newNode;
head = newNode;
}
}
void pop_back() {
if (tail == nullptr) return;
Node *temp = tail;
tail = tail->prev;
if (tail != nullptr) {
tail->next = nullptr;
}
else {
head = nullptr;
}
delete temp;
}
void pop_front() {
if (head == nullptr) return;
Node* temp = head;
head = head->next;
if (head != nullptr) {
head->prev = nullptr;
}
else {
tail = nullptr;
}
delete temp;
}
int front() {
return head->data;
}
int back() {
return tail->data;
}
void reverse() {
Node* current = head;
Node* temp = nullptr;
tail = head;
while (current != nullptr) {
temp = current->prev;
current->prev = current->next;
current->next = temp;
current = current->prev;
}
if (temp != nullptr) {
head = temp->prev;
}
}
};
#endif