Learn LinkedList & DoublyLinkedList
This commit is contained in:
parent
f31d083291
commit
5f3afcd26a
|
@ -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)
|
|
@ -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)
|
Loading…
Reference in New Issue