문제 5 · 단순 연결 리스트의 제거 연산
문제 5 [3점]
단순 연결 리스트simple linked list의 제거(remove) 연산에 대해 성능을 중심으로 서술(2점)하고, 개선 방안을 서술(1점)하시오.
풀이 및 해설
성능(2점). 단순(단방향) 연결 리스트에서 어떤 노드를 제거하려면, 그 노드의 직전 노드(predecessor)의 next 포인터를 제거 대상의 다음 노드로 이어 붙여야 합니다.
- 그런데 단방향 리스트의 노드는 이전 노드를 가리키는 링크가 없습니다. 따라서 제거 대상(또는 그 값)을 찾으려면 head부터 순차적으로 훑어야 하고, 직전 노드를 알기 위해서도 처음부터 따라가야 합니다.
- 이 탐색 과정이 최악의 경우 리스트 전체를 지나므로
이 됩니다. (설령 제거할 노드의 포인터를 이미 알고 있어도, 직전 노드를
개선 방안(1점). 각 노드가 **이전 노드를 가리키는 링크를 추가로 갖는 이중 연결 리스트doubly linked list**로 바꾸면, 제거할 노드의 포인터만 있으면 prev와 next를 통해 앞뒤 노드를 곧바로 이어 붙일 수 있어 **탐색 없이
(대안으로, 제거 대상의 다음 노드 값을 현재 노드로 복사한 뒤 다음 노드를 건너뛰어 삭제하는 기법으로 마지막 노드가 아닌 경우