자료구조

덱 (deque)

bebeghi3356 2024. 11. 27. 20:01



### **1. `llink`와 `rlink`의 역할**
- **`llink` (left link)**: 현재 노드의 **이전 노드**를 가리키는 포인터.
- **`rlink` (right link)**: 현재 노드의 **다음 노드**를 가리키는 포인터.

---

### **2. 새 노드가 삽입될 때 해야 할 작업**
`add_rear` 함수에서는 새 노드 `new_node`를 **덱의 끝에 추가**합니다.  
즉, 새로 추가된 노드는 이전의 `tail` 노드와 연결되어야 합니다.

#### (1) 기존 `tail`과 새 노드 연결
- 새 노드는 이전 노드(`tail`)을 알고 있어야 하므로, **`new_node->llink`**에 기존의 `tail`을 저장합니다.
- 동시에, 기존의 `tail`도 새 노드를 알아야 하므로, **`tail->rlink`**에 새 노드를 저장합니다.

#### (2) 새로운 `tail` 설정
- 덱의 끝이 새 노드로 변경되므로 **`tail = new_node`**로 갱신합니다.

---

### **3. 왜 `llink`를 설정하는가?**
**`llink`는 새 노드의 "이전 노드"를 가리키기 때문입니다.**  
즉, 새 노드의 관점에서 보면 **"이전 노드가 현재 `tail`이다"**라고 설정하는 것입니다.

- **`new_node->llink = tail;`**  
  새로 생성한 노드의 **이전 노드**를 기존의 `tail`로 설정.

- 반대로 **`new_node->rlink`를 기존 `tail`의 `rlink`로 설정하지 않는 이유**는,  
  새 노드는 **새로운 끝 노드**이기 때문에 다음 노드(`rlink`)가 존재하지 않아야 합니다.  
  따라서 **`new_node->rlink = NULL`**로 초기화됩니다.

---

### **4. 기존 `tail`의 `rlink`를 설정**
다음 단계에서 기존 `tail`의 **`rlink`**를 새 노드로 설정합니다:
```c
tail->rlink = new_node;
```
이 작업은 기존 `tail`이 **새 노드를 "다음 노드"로 가리키도록** 만듭니다.

---

### **5. 정리**
- **`new_node->llink = tail;`**  
  새 노드의 **이전 노드**를 설정하는 작업입니다.
  
- **기존 노드(`tail`의 `rlink`)를 먼저 설정하지 않는 이유**:  
  `llink`와 `rlink`는 서로 다른 방향을 가리키며, `new_node` 입장에서는 `llink`가 이전 노드를 가리켜야 연결 리스트가 올바르게 동작합니다.

- **`rlink`와 혼동하지 않기**:
  - `llink`: **이전 노드**를 가리킴 (역방향 링크).  
  - `rlink`: **다음 노드**를 가리킴 (정방향 링크).  


'자료구조' 카테고리의 다른 글

[자료구조] 우선순위큐 & 힙(heap)  (0) 2024.12.02
[자료구조] 트리  (1) 2024.11.27
덱(deque)  (0) 2024.11.26
[자료구조] 큐  (0) 2024.11.18
[자료구조] Stack (C언어)  (0) 2024.11.18