CS/자료구조

#1 리스트(List)

Scala0114 2021. 9. 27. 13:47

1. 리스트(List)

 리스트는 입력받은 데이터를 순차적으로 저장하는 가장 간단한 형태의 선형 자료구조이다.  리스트는 일반적으로

다음과 같은 기능을 가진다.

  • 데이터 삽입
    • insert(e) : 데이터 e를 맨 뒤에 삽입 
    • insert(e, i) : 데이터 e를 인덱스 i에 삽입
  • 데이터 삭제
    • delete(i) : 인덱스 i의 데이터 삭제
    • delete(e) : 데이터 e를 찾아 삭제
  • 데이터 탐색
    • search(i) : 인덱스 i의 데이터 반환
    • search(e) : 데이터 e를 찾아 인덱스를 반환

이 외에도 구현자의 의도에 따라 리스트의 모든 요소를 제거, 리스트의 요소를 정렬, 리스트가 비어있는지 확인 등

다양한 기능이 들어가기도 하지만 가장 기본적인것은 위의 세 가지이다.

 

 

2. 리스트의 특징

  • 구현이 간단하며 대부분의 프로그래밍 언어에서 기본 자료형 또는 내장 라이브러리의 형태로 지원
  • 다수의 데이터를 순서를 유지한채로 그룹화하여 관리하기 좋음
  • 특정 데이터를 탐색하는데 O(N) 의 시간복잡도를 보임 

 

3. 리스트의 구현 방식에 따른 특징

  • 배열 리스트(Array List) : 배열을 기반으로 구현된 리스트
    • 인덱스를 활용하여 특정 순번의 데이터에 대해 O(1) 의 시간복잡도로 빠른 탐색이 가능
    • 삽입, 삭제 연산 실행 시 데이터들의 인덱스를 조정해야하기 때문에 O(N)의 시간복잡도를 보임
    • 배열의 크기에 제한이 있어 최초에 할당했던 크기 이상의 데이터를 삽입할 경우 배열을 확장하는
      과정을 거쳐야함
  • 연결 리스트(Linked List) : 데이터를 하나의 노드로 구성하여 서로 연결시키는 것으로 구현된 리스트
    • n 번째 데이터에 접근하기 위해서는 링크를 타고 넘어가는 과정을 n번 거칠 필요가 있어 특정 순번의
      데이터를 탐색하는데 O(N)의 시간복잡도를 보임
    • 어느 위치에서 삽입/삭제 연산 실행 하더라도 새로운 노드를 만들어 전후의 연결관계만을 조정하면
      되기 때문에 O(1) 의 시간복잡도로 처리 가능
    • 데이터가 추가될 때마다 노드를 생성하기 때문에 데이터가 늘어나더라도 별도의 확장과정이 필요없음

 

4. 연결 리스트의 종류

  • 단방향 연결 리스트
    • 각 노드가 데이터다음 노드의 주소로 이루어진 연결 리스트
    • 현재 노드에서 이전 노드를 참조할 수 없음
  • 양방향 연결 리스트
    • 각 노드가 데이터와 이전 노드의 주소, 다음 노드의 주소로 이루어진 연결 리스트
    • 현재 노드의 이전 노드와 다음 노드를 모두 참조할 수 있음
  • 원형 연결 리스트
    • 양방향 연결리스트의 첫 노드와 끝 노드를 서로 연결시킨 연결 리스트
    • 현재 탐색중인 노드를 가리키는 포인터 하나만으로 head와 tail을 모두 참조할 수 있는 것과 마찬가지
    • 스트림 버퍼나 큐를 구현하는데에도 사용 가능하며 데이터를 순환탐색하기에도 편리하다.