본문 바로가기

자료구조&알고리즘

[단일 연결 리스트 ] 특정 값 노드 삭제 | 중간 값 삭제

단일 연결 리스트에서 중간 위치에 있는 노드를 삭제할 때는 삭제한 노드 양 옆에 있는 노드들을 연결해주면 된다.

그러나 head가 딸려있는 맨 첫번째 노드를 지울 때는 head 도 이동해야하기 때문에 첫 노드를 삭제하는 케이스, 중간 노드를 삭제하는 케이스 투스텝으로 나누어 코드를 작성하면 된다. 

 

<첫 번째 노드를 삭제하는 경우>

 

1. curNode 를 head의 위치로 맞추어준다. 

 

2. head 를 두번째 노드의 주소 값을 가리키도록 한다. 

 

<중간 노트를 삭제하는 경우>

 

1. curNode , preNode, head 를 첫 번째 노드 값에 집합시킨다. 

2. curNode가 6번 노드를 가리키게 하고 target 값인지 확인한다. 

3. preNode가 그 다음 노드를 가리킨다.

 

4. curNode 가 7번 노드를 가리키고 target 값이기 때문에 삭제한다. 

 

5. 6번 노드를 가리키고 있는 preNode의 포인터가 8번 노드를 가리키도록 해서 6번과 8번 노드를 이어준다. 

<코드 구현>

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

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

node* head = NULL;

void deleteNode(int target) {
    node* delNode, * preNode;

    // 리스트가 비어 있는지 확인
    if (head == NULL) return;

    // 삭제할 노드가 head인 경우
    if (head->value == target) {
        delNode = head;
        head = head->next;
        free(delNode);
        return;
    }

    delNode = head;
    preNode = NULL;

    // 타겟 노드를 찾을 때까지 리스트 순회
    while (delNode != NULL && delNode->value != target) {
        preNode = delNode;
        delNode = delNode->next;
    }

    // 타겟 노드를 찾았을 때
    if (delNode != NULL) {
        preNode->next = delNode->next;
        free(delNode);
    }
}

int main() {
    // 노드 추가 예제 (테스트를 위한 간단한 예제 코드)
    node* n1 = (node*)malloc(sizeof(node));
    node* n2 = (node*)malloc(sizeof(node));
    node* n3 = (node*)malloc(sizeof(node));
    node* n4 = (node*)malloc(sizeof(node));
    node* n5 = (node*)malloc(sizeof(node));

    n1->value = 5;
    n2->value = 6;
    n3->value = 7;
    n4->value = 8;
    n5->value = 9;

    n1->next = n2;
    n2->next = n3;
    n3->next = n4;
    n4->next = n5;
    n5->next = NULL;

    head = n1; // head가 리스트의 첫 번째 노드를 가리키도록 설정

    // 삭제 전 리스트 출력
    printf("Before deletion: ");
    node* temp = head;
    while (temp != NULL) {
        printf("%d ", temp->value);
        temp = temp->next;
    }
    printf("\n");

    int target = 8;
    deleteNode(target);

    // 삭제 후 리스트 출력
    printf("After deletion: ");
    temp = head;
    while (temp != NULL) {
        printf("%d ", temp->value);
        temp = temp->next;
    }
    printf("\n");

    // 메모리 해제
    free(n1);
    free(n2);
    free(n3);
    free(n5); // n4는 삭제되어 이미 해제되었음

    return 0;
}