Linked list(연결 리스트)는 각 노드가 데이터와 포인터를 가지고 한 줄로 연결되어 있는 방식으로 데이터를 저장하는 자료 구조입니다.
노드(node): 데이터를 담고 있는 그릇, 주로 class로 구현되기 때문에 class라고 생각해도 상관없다.
링크(link): 리스트의 순서를 유지할 수 있게 해주는 연결고리
Doubly Linked List
Doubly Linked List는 다음 노드 뿐만이 아니라 전 노드의 링크도 가지고 있는 연결 리스트입니다.
즉, 리스트의 앞과 뒤 둘다 이동이 가능한 리스트입니다.
Circular Linked List
Circular Linked List의 꼬리(tail)부분이 머리(head)부분과 연결이 되어 있는 연결 리스트입니다.
따라서, 리스트의 무한 반복이 가능합니다.
Array와 차이점
Array와 마찬가지로 순차열적으로 요소들을 저장한다는 점에서는 비슷하나 근본적으로 많은 차이를 가지고 있습니다.
배열(array)는 데이터를 논리적 순서에 따라 순차적으로 데이터를 입력하며, 물리적 주소 또한 순차적입니다. 연결리스트도 데이터를 논리적 순서에 따라 데이터를 입력하지만 물리적 주소는 순차적이지 않습니다.
배열은 인덱스를 가지고 있어서 원하는 데이터를 한번에 접근이 가능하기 때문에 데이터 접근 속도가 매우 빠릅니다.(indexing) 인덱스를 가지고 있는 배열과는 달리 연결리스트는 인덱스 대신 현재 위치의 이전 및 다음 위치를 기억하고 있습니다. 그럼으로 한번에 데이터 접근이 가능하지 않고 연결되어 있는 링크를 따라가야만 접근이 가능함으로 배열에 비해 원하는 데이터에 접근하는 속도가 떨어집니다.
배열은 데이터의 삽입/삭제에는 취약합니다. 배열 특성상 데이터 삽입/삭제가 이루어지면 삽입/삭제가 이루어진 위치의 다음부터 모든 데이터의 위치를 변경해야 하기 때문입니다. 연결리스트에서 데이터 삽입/삭제는 논리적 주소만 바꿔주면 되기 때문에 훨씬 쉽습니다.
동일한 양의 데이터를 저장해도 일반적으로 연결 리스트가 배열보다 더 많은 메모리를 차지하게 됩니다. (배열은 단순 데이터 저장인데 비해 연결리스트는 각 노드마다 객체를 생성해야 하기 때문이다.)
When To Use Linked List
데이터 양이 많지만 데이터의 삽입/삭제가 거의 없고, 데이터 접근이 빈번하게 이루어질 경우는 배열이 유리하고, 데이터 양이 그렇게 많지 않고, 데이터의 삽입/삭제가 빈번하게 이루어질 경우에는 연결리스트를 사용하는 것이 더 유리합니다.