💡 자료구조

연결리스트 - 삭제하기

ji-hyun 2021. 8. 4. 18:45

1. 첫번째 노드의 삭제

 

 

head 가 현재 head 노드의 다음 노드를 가리키게 만든다.

head = head -> next;

 

 

 

 

Node * remove_first () {         /* 주소 리턴 */
 	if (head == NULL) {
 		return NULL;
 	}
 
 	else {
 		Node *tmp = head;        /* head 노드의 주소를 임시로 보관할 포인터 */
 		head = head->next;
 		return tmp;              /* head 노드의 주소 리턴 */
 	}
}

 

if 문에서 head 가 NULL 이라는 것은 연결리스트의 노드가 하나도 없음을 의미한다. 이 경우 return NULL 로 처리한다.

else문에서 head의 주소를 임시적으로 tmp 가 가지고 있게 한다. head = head -> next 에 의해 첫번째 노드를 삭제해준다. 

 

 

참고로 모든 노드들은 동적할당으로 만들어졌기 때문에 필요 없어진 노드(여기선 head)는 free 시켜주는 것이 좋다.

 

 

 

 


2. 어떤 노드의 다음 노드 삭제

 

 

prev의 다음 노드가 null 이 아니라면, prev의 next 필드가 현재 next 노드의 다음 노드를 가리키게 만든다.

 

if (prev->next != NULL)
	prev->next = prev->next->next;

 

 

 

 

이와 관련한 함수를 적으면 다음과 같다.

 

Node *remove_after (Node *prev) {    /* 삭제된 노드 주소 반환 */
 	Node *tmp = prev->next;
 	if (tmp == NULL) {        /* 삭제할 노드가 존재하지 않음 */
 		return NULL;      /* 널 반환 */
 	}
 
 	else {
 		prev->next = tmp->next;
 			return tmp;     /* 주소 반환 */
 	}
}

 

 

위의 코드는 아래 그림과 같은 상황인 것이다.

 

 

 

 

 

연결리스트의 어떤 노드를 삭제할 때는 삭제할 노드의 바로 앞 노드의 주소가 필요하다. 삭제할 노드의 주소만으로는 삭제할 수는 없다는 점을 기억하자.