본문 바로가기

자료구조&알고리즘

[단일연결 리스트] 전체 노드 삭제

단열 연결 리스트에서 전체 노드를 모두 삭제하는 방법을 그림을 통해서 설명해보겠다. 

 

1. 4개의 노드 중 delNode 삭제할 첫 번째 노드를 가리킨다. 

2. delNode 가 첫 번째 노드를 가리키고 있기 때문에 시작 노드를 가리키는 head 는 그 다음 값을 가리키도록 설정한다. 

3. 1번 노드 삭제 후 delNode 가 2번 노드를 가리키도록 설정한다. 

4. head 가 3번 노드를 가리키도록 설정한다. 

5. 2번 노드를 지운 후 delNode 는 3번 노드를 가리킨다. 

6. head 가 마지막 4번 노드를 가리킨다.

 

7. 3번 노드 삭제 후 delNode 는 마지막 4번 노드를 가리킨다. 

 

8. head 는 그 다음 노드를 가리켜야 하는데 노드가 없으니까 아무것도 가리키지 않는 NULL 상태가 된다. 

 

9. 4번 노드를 삭제하고 함수가 종료된다. 

 

<코드로 구현>

#include <stdio.h>
#include <stdlib.h>

typedef struct node {
    int value;
    struct node* next;
} node;

node* head = NULL;

void removeNode() {
    node* delNode = head; //delNode 가 첫번째 노드를 가리킴 

    while (head != NULL) { // head 가 가리키는 대상이 있을때까지 반복
        head = head->next; // head 이동 
        free(delNode); //노드 삭제
        delNode = head; // delNode 이동 
    }
}

int main() {
    // 예시 코드: 연결 리스트를 생성하고 제거하는 예제
    node* node1 = (node*)malloc(sizeof(node));
    node* node2 = (node*)malloc(sizeof(node));
    node* node3 = (node*)malloc(sizeof(node));
    node* node4 = (node*)malloc(sizeof(node));

    node1->value = 1;
    node1->next = node2;

    node2->value = 2;
    node2->next = node3;

    node3->value = 3;
    node3->next = NULL;
    
    node3->value = 4;
    node3->next = NULL;

    head = node1;

    removeNode();

    if (head == NULL) {
        printf("연결 리스트가 성공적으로 제거되었습니다.\n");
    } else {
        printf("연결 리스트 제거에 실패했습니다.\n");
    }

    return 0;
}