연결 리스트(linked list): 실행 시간에 메모리를 할당하거나 해제할 수 있는 동적 자료 구조. 각 노드가 다음 노드에 대한 참조를 갖는 점이 특징이다.
단일 연결 리스트(Singly Linked list)와 이중 연결 리스트(Doubly Linked list)로 분리된다.
연결 리스트의 시작을 헤드라고 부르며, (연결 리스트에 항목이 삽입되기 전) 헤드 속성의 기본 값은 null이다.
헤드 자리에 값을 삽입하며, 기존의 헤드 노드를 새 노드의 next로 연결한다.
(헤드가 비어있는 경우, 헤드는 신규 노드로 설정된다.)
삭제를 원하는 노드의 참조를 제거함으로써 구현한다.
삭제하고 싶은 노드(이하 a)가
헤드에 헤드의 next 노드를 설정한다.
이 방식으로 연결 리스트를 사용한 스택을 구현할 수 있다.
모든 next 포인터를 반복 순회하여 검색한다.
양방향 단일 연결 리스트와 비슷하다.
리스트의 시작을 헤드 포인터라 부르고, 리스트의 끝을 테일 포인터라 부른다.
단 하나의 노드만 존재하는 경우 해당 노드는 헤드인 동시에 테일이다.
단일 연결 리스트의 삽입, 삭제와 비슷하나 이중 연결 리스트에서는 next 속성과 prev 속성이 함께 갱신되어야 하는 점이 다르다.
단일 연결 리스트에서 헤드에 항목을 삽입하는 것과 비슷하나, prev 포인터를 갱신해야 하는 점이 다르다.
현재 테일인 노드를 테일의 prev에 연결하고, 새 노드를 테일의 next에 연결한다. 즉 새 노드가 테일이 된다.
항목이 하나일 경우 헤드와 테일 모두를 null로 설정한다.
항목이 여러 개 존재하는 경우 현재 헤드를 헤드의 next 포인터로 설정한다.
이후 신규 헤드의 prev를 null로 설정한다.
이 방식은 큐 자료 구조의 dequeue 함수처럼 사용할 수 있다.
헤드 항목 삭제와 동일한 방식으로 삭제한다.
이런 방식 때문에 이중 연결 리스트는 양방향 큐 자료 구조와 비슷하게 사용될 수 있다.
next 포인터를 사용해 헤드에서부터 검색할 수 있고, prev 포인터를 사용해 테일에서부터 검색할 수도 있다.
이처럼 양방향으로 검색이 가능하기 때문에 완전 검색을 수행할 수 있다.