서론
별건 아니고, 이번 주차 LinkedList 문제 풀이를 하며 나를 포함한 여러 스터디원께서 ListIterator을 사용해 문제를 풀었기에 List Iterator에 대해 자세히 알아보려고 한다.
List Iterator란?
Linked List를 효율적으로 사용하기 위해 등장한 인터페이스이며 기존에 있던 Iterator 인터페이스를 상속받아 더 많은 기능을 제공한다.
기존 Iterator 메소드
| 메소드 | 설명 |
|---|---|
| boolean hasNext() | 해당 이터레이션(iteration)이 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함. |
| E next() | 이터레이션(iteration)의 다음 요소를 반환함. |
| default void remove() | 해당 반복자로 반환되는 마지막 요소를 현재 컬렉션에서 제거함. (선택적 기능) |
단방향으로만 이동 가능
향상된 ListIterator 메소드
| 메소드 | 설명 |
|---|---|
| void add(E e) | 해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능) |
| boolean hasNext() | 이 리스트 반복자가 해당 리스트를 순방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함. |
| boolean hasPrevious() | 이 리스트 반복자가 해당 리스트를 역방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함. |
| E next() | 리스트의 다음 요소를 반환하고, 커서(cursor)의 위치를 순방향으로 이동시킴. |
| int nextIndex() | 다음 next() 메소드를 호출하면 반환될 요소의 인덱스를 반환함. |
| E previous() | 리스트의 이전 요소를 반환하고, 커서(cursor)의 위치를 역방향으로 이동시킴. |
| int previousIndex() | 다음 previous() 메소드를 호출하면 반환될 요소의 인덱스를 반환함. |
| void remove() | next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 리스트에서 제거함. (선택적 기능) |
| void set(E e) | next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 전달된 객체로 대체함. (선택적 기능) |
양 방향으로 이동이 가능하고 더 다양한 메소드를 지원한다.
메소드 사용 예제
void add(E e)
LinkedList<Integer> LL = new LinkedList<>();
LL.add(1);
LL.add(2);
LL.add(3);
LL.add(4);
System.out.println(LL);
ListIterator<Integer> iter = LL.listIterator();
iter.add(0);
System.out.println("----------------");
System.out.println(LL);
실행 결과
[1, 2, 3, 4]
----------------
[0, 1, 2, 3, 4]
[Execution complete with exit code 0]
hasNext + next, hasPrevious + previous
LinkedList<Integer> LL = new LinkedList<>();
LL.add(1);
LL.add(2);
LL.add(3);
LL.add(4);
ListIterator<Integer> iter = LL.listIterator();
while(iter.hasNext()){
System.out.print(iter.next() + " ");
}
System.out.println("\n---------------");
iter = LL.listIterator(LL.size());
//iter의 위치를 맨 끝으로 이동시킨 후 생성
while(iter.hasPrevious()){
System.out.print(iter.previous() + " ");
}
실행결과
1 2 3 4
---------------
4 3 2 1
[Execution complete with exit code 0]
nextIndex, previousIndex
ListIterator<Integer> iter = LL.listIterator();
while(iter.hasNext()){
System.out.print(iter.nextIndex() + " ");
iter.next();
}
System.out.println("\n---------------");
iter = LL.listIterator(LL.size());
//iter의 위치를 맨 끝으로 이동시킨 후 생성
while(iter.hasPrevious()){
System.out.print(iter.previousIndex() + " ");
iter.previous();
}
실행결과
0 1 2 3
---------------
3 2 1 0
[Execution complete with exit code 0]
Set
LinkedList<Integer> LL = new LinkedList<>();
LL.add(1);
LL.add(2);
LL.add(3);
LL.add(4);
ListIterator<Integer> iter = LL.listIterator();
//[!1, 2, 3, 4] ! <- iter위치
iter.next(); //[1, !2, 3, 4] ! <- iter위치
iter.next(); //[1, 2, !3, 4] ! <- iter위치
iter.set(5); //마지막으로 반환된 값 2를 5로 변경시킨다.
System.out.println(LL);
실행결과
[1, 5, 3, 4]
[Execution complete with exit code 0]
결론
LinkedList 문제에서 바늘과 실처럼 따라오는 인터페이스이므로 잘 알고 사용을 하는 것이 좋아보인다. LinkedList의 ListIterator는 실제 키보드의 커서처럼 작동하므로 사용하고 있는 자료구조의 노드 위치(인덱스 주소)를 기억함으로써 LinkedList에서 특히 효과적으로 활용할 수 있다.
출처
'알고리즘' 카테고리의 다른 글
| [JAVA] 백준 7795번 "먹을 것인가 먹힐 것인가" (0) | 2024.07.16 |
|---|---|
| [JAVA] 0x09 백준 9466번 "텀 프로젝트" (0) | 2024.07.02 |
| [JAVA] 0x08 백준 2504번 "괄호의 값" (1) | 2024.06.26 |
| [JAVA] 0x07 백준 11003번 "최솟값 찾기" (2) | 2024.06.19 |
| 0x05 백준 6198 (옥상 정원 꾸미기) (2) | 2024.06.03 |