자료구조

1. 리스트(3) List Iterator, DLink

늦깍이 2022. 9. 5. 19:50
  • List Iterator와 Doubly Linked List(이하 DLink)는 왜 등장하게 되었을까?
    Array List와 Linked List의 리스트 순회 시간 복잡도는 어떻게 될까?
List<Integer> list = new ArrayList<>(); (혹은 new LinkedList<>();)

for(int i = 0; i < list.length(); i++)
	System.out.println(list.getValue()); // 리스트 순회하는 이 구문의 시간 복잡도는?

        Array List의 경우 : O(n)

        Linked List의 경우 : O(n²)

  • Linked List의 시간 복잡도를 줄일 수 있는 방법이 뭐가 있을까?
    첫번째 방법 - curr을 매번 이동하는 것이 아닌 한 노드 옮겨갈 때마다 그 위치를 기억하도록 하자.
Link<Integer> curr = (LinkedList<Integer> list).head(); //Linked List로 형변환(Type cast)
Link<Integer> tail = (LinkedList<Integer> list).tail();

while(curr != tail){ // curr이 tail이 되기 전까지 하나씩 앞으로 전진하는 방식
	curr = curr.next();
    System.out.println(curr.item());
}

        해당 방법을 사용하면 Linked List의 시간 복잡도는 O(n)이 된다.
        

        문제점 - 그렇다면 ADT는 왜 만들었고, 코드가 간결해지지 못한 모습이다. 또한 리스트로서 사용하고 싶을 뿐인데 Linked List로 형

        변환까지 해야한다면 굳이 이 코드를 사용할 의미가 있는가?


        두번째 방법 - Iterator 패턴을 사용하자!

  • Iterator Pattern
List Iterator ADT

public interface Iterator<E>{
    boolean hasNext(); // curr의 다음이 있는가?
    E next(); // 다음 값을 가져와준다.
    boolean hasPrev(); // curr의 이전이 있는가?
    E prev(); // 이전 값을 가져와준다.
}
  • Array List의 경우(구현)

  • Linked List의 경우(구현)

  • List Iterator의 한계
    반대 방향 순회 previous()의 시간 복잡도가 여전히 O(n²)이다.
    해결책 : DLink
  • Doubly Linked List(이하 DLink)
    DLink란? next와 prev를 모두 가지고 있는 노드들이 연결된 리스트

        구현

        Insert 와 Remove

'자료구조' 카테고리의 다른 글

4. 트리 Tree  (0) 2022.09.18
3. 큐 Queues  (0) 2022.09.13
2. 스택 stack  (0) 2022.09.06
1. 리스트(2) Linked list  (0) 2022.09.04
1. 리스트(1) Array Lists  (0) 2022.09.04