본문/내용
이중 연결 리스트의 역순 변환 코드 예시
제공된 코드는 이중 연결 리스트를 역순으로 변환하는 알고리즘의 핵심 부분을 구현하고 있습니다. 각 노드의 `prev`와 `next` 포인터를 교환하여 연결 방향을 반대로 바꾸는 방식을 사용합니다.
<빈칸 코드 완성>
```c
void reverse(struct Node head_ref) {
struct Node temp = NULL;
struct Node current = head_ref;
while (current != NULL) {
temp = current->prev;
current->prev = current->next;
current->next = temp; // 핵심: next와 prev 포인터 교환
current = current->prev; // 이제 prev 방향으로 이동 (원래의 next 방향)
}
if(temp != NULL)
head_ref = temp->prev; // 새로운 head 설정
}
```
<코드 설명>
1. `temp`, `current` 포인터를 사용하여 리스트를 순회합니다.
2. 각 노드에서 `prev`와 `next` 포인터를 교환합니다.
3. `current` 포인터를 이전 `prev` 방향 (즉, 원래의 `next` 방향)으로 이동시켜 리스트를 순회합니다.
4. 마지막 노드에 도달하면, `temp`는 원래의 마지막 노드를 가리키므로, `temp->prev`가 새로운 헤드가 됩니다.
시간 복잡도 분석
이 알고리즘은 리스트의 모든 노드를 한 번씩 방문하므로 시간 복잡도는 O(n)입니다. 여기서 n은 리스트의 노드 개수입니다.
결론
이중 연결 리스트의 역순 변환은 각 노드의 `prev`와 `next` 포인터를 교환하는 간단한 방식으로 구현할 수 있습니다. 제공된 코드는 이 알고리즘을 효율적으로 구현하며, O(n)의 시간 복잡도를 갖습니다.