Learn LinkedList & DoublyLinkedList

This commit is contained in:
kwhong95 2024-05-02 00:51:32 +09:00
parent f31d083291
commit 5f3afcd26a
2 changed files with 160 additions and 0 deletions

View File

@ -0,0 +1,97 @@
## Doubly Linked List(이중 연결 리스트)
순차적으로 링크된 노드라는 레코드 세트로 구성된 링크된 데이터 구조
각노드에는 링크라고 하는 두 개의 필가 있으며, 노드 순서에서 이전 노드와 다음 노드에 대한 참조를 가집니다.
![doubly-linked-list](https://github.com/kwhong95/bot_rps/assets/70752848/eaff5bdc-c458-4719-a3e3-da805be8cb82)
#### 활용 예시
> 웹 페이지의 이력을 관리하는 '뒤로 가기' 및 '앞으로 가기' 기능
사용자가 여러 페이지를 방문하면서 이전에 방문한 페이지로 쉽게 이동할 수 있는 기능을 구현하는데 **Doubly Linked List**를 사용할 수 있습니다.
예를 들어, 웹 애플리케이션에서 사용자가 각 페이지를 방문할 때마다 해당 페이지에 대한 정보를 **Doubly Linked List**에 추가할 수 있습니다. 각 노드는 방문한 페이지의 URL이나 정보를 저장하며, 이전 페이지와 다음 페이지를 가리키는 포인터를 가지고 있습니다.
사용자가 '뒤로 가기' 버튼을 클릭하면 현재 페이지에서 이전 페이지로 이동할 수 있도록 **Doubly Linked List**의 이전 노드를 참조하고 해당 페이지로 이동합니다. 마찬가지로 '앞으로 가기' 버튼을 클릭하면 다음 페이지로 이동하도록 **Doubly Linked List**의 다음 노드를 참조하고 해당 페이지로 이동할 수 있습니다.
이를 통해 사용자는 웹 애플리케이션 내에서 쉽게 페이지 이동을 관리하고 이전 방문한 페이지로 손쉽게 이동할 수 있게 됩니다. **Doubly Linked List**는 이전 페이지와 다음 페이지의 관계를 더 효율적으로 관리하고 쉽게 탐색할 수 있는 구조를 제공하여 웹 페이지의 이력을 관리하는 데 유용하게 활용될 수 있습니다.
#### 활용 예시 코드로 구현해보기
```ts
// Node 클래스: 각 페이지를 나타내는 클래스
class Node {
public url: string;
public prev: Node | null;
public next: Node | null;
constructor(url: string) {
this.url = url; // 페이지의 URL
this.prev = null; // 이전 페이지를 가리키는 포인터
this.next = null; // 다음 페이지를 가리키는 포인터
}
}
// WebHistory 클래스: 웹 페이지 이력을 관리하는 클래스
class WebHistory {
private current: Node | null;
constructor() {
this.current = null; // 현재 페이지를 가리키는 포인터
}
// 현재 페이지를 나타내는 노드를 추가하는 메서드
public addPage(url: string) {
const newNode = new Node(url);
if (this.current) {
this.current.next = newNode;
newNode.prev = this.current;
}
this.current = newNode;
}
// 이전 페이지로 이동하는 메서드
public goBack() {
if (this.current && this.current.prev) {
this.current = this.current.prev;
console.log('이전 페이지로 이동:', this.current.url);
} else {
console.log('더 이상 이전 페이지가 존재하지 않음');
}
}
// 다음 페이지로 이동하는 메서드
public goForward() {
if (this.current && this.current.next) {
this.current = this.current.next;
console.log('다음 페이지로 이동:', this.current.url);
} else {
console.log('더 이상 다음 페이지가 존재하지 않음');
}
}
}
// 웹 페이지 이력을 관리하는 예시
const webHistory = new WebHistory();
webHistory.addPage('https://www.example.com/page1');
webHistory.addPage('https://www.example.com/page2');
webHistory.goBack(); // 이전 페이지로 이동: https://www.example.com/page1
webHistory.goForward(); // 다음 페이지로 이동: https://www.example.com/page2
```
#### 시간 복잡도
| Access | Search | Insetion | Deletion |
| :---: | :---: | :---: | :---: |
| O(n) | O(n) | O(1) | O(1) |
#### 공간 복잡도
O(n)

View File

@ -0,0 +1,63 @@
## Linked List(연결 리스트)
**데이터 요소의 선형 집합**, 메모리 내 물리적 배치에 따라 선형 순서가 지정되지 않습니다.
(흔히 배열에서 다루는 인덱스 개념이 아닌듯?)
대신 각 요소는 다음 요소를 가르킵니다. 이는 시퀀스를 함께 나타내는 노드 그룹으로 구성된 데이터 구조입니다.
![linked-list](https://github.com/kwhong95/bot_rps/assets/70752848/b6ae25f7-6cdf-4aeb-a538-75caf176d812)
#### 간단한 코드로 구조 이해하기
```js
// Node 클래스: 각 노드를 나타내는 클래스
class Node {
constructor(value) {
this.value = value; // 현재 노드의 값
this.next = null; // 다음 노드를 가리키는 포인터
}
}
// Linked List 클래스: Linked List를 나타내는 클래스
class LinkedList {
constructor() {
this.head = null; // 맨 처음 노드를 가리키는 포인터
this.tail = null; // 맨 마지막 노드를 가리키는 포인터
}
// 값(value)을 Linked List의 맨 뒤에 추가하는 메서드
add(value) {
// Linked List가 비어있으면 새로운 노드를 head와 tail로 지정
let newNode = new Node(value);
if (this.head === null) {
this.head = newNode;
this.tail = newNode;
} else {
// Linked List에 이미 노드가 있을 경우, tail 노드의 next를 새로운 노드로 설정하고 tail을 업데이트
this.tail.next = newNode;
this.tail = newNode;
}
}
}
```
#### 활용 예시
> 페이지 내 이동을 관리하는 라우팅 시스템
일반적으로 브라우저의 뒤로 가기 및 앞으로 가기 버튼을 관리하고 페이지 이력을 추적하기 위해 **Linked List** 가 사용될 수 있습니다.
예를 들어, 사용자가 앱 또는 웹사이트에서 다양한 페이지를 이동하고 방문할 때 마다 현재 페이지를 **Linked List**에 추가하여 사용자의 이동 기록을 저장할 수 있습니다. 이를 통해 이전 페이지로 돌아가거나 특정 페이지로 이동할 때 **Linked List**를 활용하여 효율적으로 이동을 관리할 수 있습니다.
또 다른 예시로는 반복적인 동적 요소를 처리할 때 **Linked List**를 사용할 수 있습니다. 예를 들어, 동적으로 추가되는 항목들의 리스트나 트리구조를 관리할 때 **Linked List**를 활용하여 각 항목의 순서를 관리하거나 이동할 수 있습니다.
#### 시간 복잡도
| Access | Search | Insertion | Deletion |
| :---: | :---: | :---: | :---: |
| O(n) | O(n) | O(1) | O(n) |
#### 공간 복잡도
O(n)