문제 6 · 원형 단순 연결 리스트
문제 6 [3점]
단순 연결 리스트를 원형으로 구현하여, 원형 단순 연결 리스트circular simple linked list라는 자료구조를 만들었다고 생각해보자. 이 경우, 삽입(insert), 제거(remove) 연산의 성능은 어떻게 변하는지 서술(각 1.5점)하시오.
풀이 및 해설
원형 단순 연결 리스트는 마지막 노드의 next가 다시 첫 노드(head)를 가리키도록 이어 붙인 구조입니다. 보통 꼬리(tail) 노드 하나만 가리키는 포인터를 유지하는데, 그러면 tail->next가 곧 head이므로 **맨 앞과 맨 뒤에 모두
삽입(insert) — 1.5점.
- 일반 단순 연결 리스트는 tail 포인터가 없으면 끝에 삽입할 때 마지막 노드까지 훑어야 해서
이 듭니다. - 원형 리스트에서 tail을 유지하면, 앞(
tail->next뒤)이든 뒤(tail뒤)든 **포인터 몇 개만 바꾸면 되어 **에 삽입할 수 있습니다. 새 노드를 tail 다음에 넣고 tail을 갱신하면 끝쪽 삽입, tail을 그대로 두면 앞쪽 삽입이 됩니다.
제거(remove) — 1.5점.
- 맨 앞 노드 제거는
tail->next를 그다음 노드로 바꾸면 되어 입니다. - 그러나 임의의 노드나 맨 뒤 노드 제거는 여전히 그 직전 노드를 알아야 하는데, 단방향이라 직전 노드를 얻으려면 한 바퀴를 돌아야 합니다. 따라서 임의 제거는 그대로
입니다.
정리하면, 원형화 + tail 유지는 끝에 대한 접근·삽입을 상수 시간으로 만들어 주지만, 단방향이라는 한계 때문에 임의 위치의 제거는 여전히 선형 시간입니다.