단일 연결 리스트에서 중간 위치에 있는 노드를 삭제할 때는 삭제한 노드 양 옆에 있는 노드들을 연결해주면 된다.
그러나 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;
}
'자료구조&알고리즘' 카테고리의 다른 글
[단일 연결 리스트] 문자열 노드 전체 제거 (0) | 2024.05.30 |
---|---|
[단일연결리스트] 노드 정렬 삽입(오름차순) (1) | 2024.05.25 |
[단일 연결 리스트 ] 특정 값 노드 검색 (0) | 2024.05.25 |
[단일연결 리스트] 전체 노드 삭제 (0) | 2024.05.25 |
[단일 연결 리스트] 첫 노드 삭제 (0) | 2024.05.19 |