배울 구조 : ListIterator클래스 / next(), hasNext(), add(), remove()
>>LinkedList.ListIterator 객체의 메소드의 자료구조<<
ListIterator라는 클래스를 인스턴스화시키는 메소드 listIterator()를 작성
-->
해당 메소드를 호출하면 new연산자와 ListIterator()생성자를 리턴하게 된다.
그럼 LinkedList의 내부 클래스인 ListIterator클래스를 작성해보자.
이 내부 클래스에서도 필요한 필드와 메소드를 작성해야 한다.
ListIterator클래스에서
next(), hasNext()는 다음과 같은 구조로 존재한다.
이렇게 next()와 hasNext() 메소드를 ListIterator라는 이너클래스에서 정의를 하면
add()
>>이터레이터에서 넥스트 넥스트 해가는 중에 add()로 객체를 추가할 수 있다.
LinkedList.ListIterator i = numbers.listIterator();
i.add(5);
만약 위처럼 next()가 전혀 실행되지 않은 상황에서 add(Object)를 하게되면
LinkedList의 첫 번째 노드에 해당 객체를 저장하도록 하자.
ListIterator()생성자 호출시 next=head;다.
또한 중간에 newNode가 들어갈 수도 있다.
그러면 lastReturned.next = newNode; 랑 newNode.next = next;해주면 된다는 사실~~!
remove()
LinkedList.ListIterator i = numbers.listIterator();
i.remove();
넥스트안한 상태에서 remove()하면 어떻게 될까요??
예외를 발생시켜야 한다. (지워지는 대상은 lastReturned가 가리키는 노드)
LinkedList.ListIterator i = numbers.listIterator();
i.next();
i.remove();
이렇게 이미 이전에 next()를 호출하여 중간에 가 있는 상황이라면?
그냥 lastReturned가 가리키는 노드가 제거 대상이니까, 이 노드의 앞뒤 연결만 변경해주면 된다.
그럼 lastReturned 이전노드의 next값을 현재next인 것으로 해주면 되는 거쥐!!
>>근데 우리는 LinkedList에서는 이런 비효율성이 어쩔 수 없다.
lastReturned의 이전노드에 다가가기 위해서는 헤드부터 넥스트 넥스트.. 해서 가야한다.
이전으로 가는 기능은 LinkedList에 없다.
>>그래서 이전노드로 접근할 수 있는 DoublyLinkedList에서는 다른 구조를 가질 것이다!
이런 이점을 활용해야 좋은 경우가 있다면 그때는 이 더블리링크드리스트를 선택하겠죠?!
헉 ArrayList할때 Iterator 구조 학습 안하고 왔다!! 왜 건너뛰고 여기까지 왔지?? ㅠㅡㅠ
지금 해야겠다..
'자료구조 + 알고리즘' 카테고리의 다른 글
[자료구조] ArrayList 구현 - remove, removeFirst, removeLast [JAVA] (0) | 2020.08.21 |
---|---|
[자료구조] ArrayList 구현 - ListIterator 클래스 [JAVA] (0) | 2020.08.21 |
[자료구조] LinkedList 구현 - size, get, indexOf 메소드 [JAVA] (0) | 2020.08.20 |
[자료구조] LinkedList 구현 - remove, removeFirst, removeLast [JAVA] (0) | 2020.08.20 |
[자료구조] LinkedList 구현 - toStrnig [JAVA] (0) | 2020.08.20 |