본문 바로가기
자료구조

리스트 {링크드 리스트, 더블 링크드 리스트, 환형 링크드 리스트}

by hungry- 2025. 4. 15.

 

리스트

목록 형태로 이루어진 데이터 형식.

 

목록을 이루는 개별 요소노드 (Node)라고  하고 첫 번째 노드헤드 (Head), 마지막 노드테일(Tail)이라고 함.

 

리스트의 길이는 헤드부터 테일까지의 노드 개수와 같다.

 

배열과의 차이: 배열은 크기를 지정해줘야 하고 생성 후에 크기를 변경할 수 없다.

리스트는 데이터 집합 보관 기능을 가지면서도 유연하게 크기를 바꿀 수 있는 자료구조이다.

 

링크드 리스트

링크드 리스트는 노드를 연결해서 만든 리스트, 링크드 리스트의 노드는 데이터를 보관하는 필드와 다음 노드와 연결 고리 역할을 하는 포인터로 이루어짐.

링크드 리스트 노드 구조체

 

노드 생성과 소멸

노드 생성/소멸 : malloc()으로 할당, free()로 해제

노드 추가 연산

노드 추가 연산: 링크드리스트의 테일 노드 뒤에 새로운 노드를 만들어 연결하는 연산. 꼬리 붙이기

노드 탐색 연산

노드 탐색 연산: 헤드부터 시작해서 차근차근 노드의 개수만큼 거쳐가야 원하는 요소에 접근할 수 있음. 찾고자 하는 요소가 N번째에 있으면 N-1개의 노드를 거쳐야 함.

노드 삭제 연산

노드 삭제 연산: 링크드 리스트 내 노드를 제거하는 연산으로 삭제하고자 하는 노드를 찾은 뒤  해당 노드의 이전 노드가 삭제할 노드가 가리키던 노드를 가리키게 함.

노드 삽입 연산

노드 삽입 연산 : 노드와 노드 사이 새로운 노드를 끼워 넣는 연산

노드 개수 세기 연산

 

노드 개수 세기 연산: 링크드 리스트 내 존재하는 노드의 개수를 세어 그 결과를 반환.


장점
 - 새로운 노드의 추가, 삽입, 삭제가 쉽고 빠르다

단점 - 다음 노드를 가리키려는 포인터 때문에 각 노드마다 추가적인 메모리가 필요, 특정 위치에 있는 노드에 접근하기 위한 비용이 크고 시간이 많이 소요됨. n번째 위치에 있는 노드에 접근하려면 n회의 노드 탐색 루프를 실행해야 접근할 수 있음.

더블 링크드 리스트

더블 링크드 리스트: 링크드 리스트의 탐색 기능을 개선한 자료구조. 양방향 탐색이 가능.다음 노드와 이전 노드를 가리키는 포인터를 갖고 있음.

더블 링크드 리스트 노드 구조체

노드 생성/소멸: 링크드 리스트에서 이전 노드 (PrevNode)를 초기화시키는 부분만 추가되고 나머지 동일.

노드 추가 연산: 새로 추가된 노드의 이전 노드(PrevNode)가 기존 테일이었던 코드를 가리키게 하는 것만 추가되고 나머지 동일.

 

노드 삭제 연산

노드 삭제 연산: 삭제할 노드의 이전 노드는 삭제할 노드의 다음노드를 가리키고 다음 노드는 이전 노드를 가리키게 바꿈. 삭제할 노드의 NextNode와 PrevNode는 NULL로 초기화.

노드 삽입 연산

노드 삽입 연산: 삽입할 노드의 PrevNode 포인터로는 이전 노드를 , NextNode 포인터로는 다음 노드를 가리키게 하고 이전 노드의 NextNode 포인터와 다음 노드의 PrevNode 포인터를 새 노드를 가리키게 함.

노드 개수 세기 연산: 링크드 리스트와 동일.

 

 

환형 링크드 리스트

 

환형 링크드 리스트: 머리가 꼬리를 물고 있는 형태의 링크드 리스트로 더블 링크드 리스트로도 링크드 리스트로도 만들 수 있음.

테일의 다음 노드 포인터가 헤드를 가리키도록 하면 됨. 테일은 헤드의 이전 노드, 헤드는 테일의 다음 노드이다. 

여기선 더블 링크드 리스트로 구현했음.

노드 추가 연산

노드 추가 연산: 리스트가 비어 있을 때 새 노드를 추가 시 이전 노드도 자신, 다음 노드도 자신을 가리킨다.

리스트가 비어 있지 않은 경우 추가 연산 과정을 테일과 헤드 사이 새 노드를 삽입한다고 이해하기.

노드 삭제 연산

노드 삭제 연산: 테일과 헤드가 연결되어 있다는 사실에 주의, 크게 다르지 않음.