이전에서는 정리한 포인터를 이용한 연결리스트는 노드의 삽입, 삭제를 데이터 이동 없이 수행한다라는 장점이 있지만 삽입, 삭제를 수행할때마다 노드용 객체를 위한 메모리 영역을 확보하고 해제하는 과정이 필요합니다.
그러므로, 프로그램 실행 중에 데이터 수가 크게 바뀌지 않는 경우, 또는 데이터 수의 최댓값을 미리 알 수 있는 경우에는 배열을 사용해 연결리스트를 효율적으로 이용할 수 있습니다.
여기서 다음 노드를 가리키는 뒤쪽 포인터는 다음 노드에 대한 포인터가 아니라 다음 노드가 들어있는 배열 요소의 인덱스입니다. 이 인덱스 포인터를 커서라고 합니다.
꼬리 노드의 커서는 배열의 인덱스가 될 수 없는 값인 -1로 합니다. 머리 노드를 나타내는 head도 커서이기 때문에 머리 노드 A가 들어있는 곳인 인덱스 1이 head값이 됩니다.
위에서 정리한 연결 리스트에서 삭제한 노드 관리에 대해서 살펴보도록 하겠습니다.
그런데 삭제를 여러 번 반복하면 배열 안은 빈 레코드투성이가 됩니다. 삭제한 레코드가 하나라면 그 인덱스를 어떤 변수를 넣어두고 관리함으로써 그 레코드를 쉽게 재사용할 수 있습니다. 그러나 실제로는 여러 레코드를 삭제하는 경우가 많으므로 단순히 해결이 되지는 않습니다.
삭제한 여러 레코드를 관리하기 위해 그 순서를 넣어두는 연결 리스트인 프리리스트를 사용합니다.
꼬리 노드가 머리 노드를 가리키는 연결 리스트를 원형 리스트라고 합니다. 원형 리스트는 고리모양으로 나열된 데이터를 정리할 때 알맞은 자료구조입니다.
보통의 연결 리스트와 다른 점은 꼬리 노드의 다음 노드를 가리키는 포인터가 NULL이 아니라 머리 노드의 포인트라는 점입니다.
연결 리스트의 가장 큰 단점은 다음 노드는 찾기 쉽지만 앞쪽 노드는 찾기 어렵다는 점입니다. 이런 단점을 개선한 자료구조가 이중 연결 리스트입니다.
각 노드에는 다음 노드에 대한 포인터와 앞쪽 노드에 대한 포인터가 주어집니다.