Java 배열리스트와 연결리스트

앞서 배열리스트와 연결리스트를 직접 구현하였다.

빅오 비교 표

기능 배열리스트 연결리스트
인덱스 조회 O(1) O(n)
검색 O(n) O(n)
앞에 추가(삭제) O(n) O(1)
뒤에 추가(삭제) O(1) O(n)
평균 추가(삭제) O(n) O(n)
  • 배열리스트는 인덱스를 통한 추가 및 삭제에는 (1) 으로 빠르다.
  • 연결 리스트는 인덱스를 통한 추가 및 삭제에는 (n) 으로 느리다. 찾은 다음 참조 값만 변경하므로 O(1) 속도이다.
  • 데이터를 인덱스로 처음 위치 접근해 추가할 경우
    • 배열리스트는 데이터를 이동시켜야하므로 O(n)이다.
    • 연결리스트는 참조 값만 변경하고 데이터를 입력하므로 O(1)이다.
  • 데이터를 마지막 위치로 접근해 추가할 경우
    • 배열리스트는 마지막 위치를 바로 찾는다. O(1)
    • 연결리스트는 마지막까지 순회하며 노드를 찾아야한다. 마지막 노드에는 O(1) 속도가 걸린다.

배열리스트과 연결리스트 각각의 사용처

데이터를 조회할 일이 있으며 뒷 부분에 데이터를 추가한다면 배열 리스트가 좋은 성능을 나타낸다.
앞쪽 데이터를 추가나 삭제할 일이 있다면 연결 리스트 사용이 더 좋은 성능을 제공한다.


연결리스트 종류

단일 연결 리스트

  • 이전에 직접 구현한 연결 리스트는 단일 연결 리스트이다.
  • 노드를 앞 뒤로 모두 연결해 이중 연결 리스트 사용으로 성능을 개선할 수 있다.
  • 자바가 제공하는 연결 리스트는 이중 연결리스트이다.
    • 마지막 노드를 참조하는 변수를 가지고 있으므로, 뒤에 추가나 삭제에 O(1) 성능을 자랑한다.

이중 연결 리스트 예시 - Node

public class Node {
    Object item;
    Node next;
    Node prev;
}

이중 연결 리스트 예시 - LinkedList (last 필드 추가)

public class LinkedList {
    private Node first;
    private Node last;
    private int size = 0;
}