removeLast 메서드
리스트 끝으로 도달함을 확인하는 코드이다
current == tail
current.next = null //NullPointerException 발생할 수 있음
리스트가 비어있으면 null을 반환
removeLast는 removeFirst와 방식이 같다
**removeFirst : 리스트가 비어있거나 요소가 한개만 있는 상황 등에도 잘 실행된다
-> 코드를 그대로 사용
removeLast 코드 구현
public E removeLast() {
if(head == null)
return null;
if(head == tail)
return removeFirst(); //요소가 하나인 리스트 -> 여기서 끝
//리스트의 요소 살펴보기
Node<E> current = head.previous = null;
while(current != tail) {
//순서가 중요
previous = current;
current = current.next;
} //current -> tail을 가리킴
previous.next = null; //previous.next는 이미 tail이기 때문에 null값으로 변경
tail = previous
currentSize--;
return current.data;
remove와 find
특정 요소를 리스트에서 제거
제거하고 싶은 위치를 파악해야 한다
public E remove(E obj) {
//제거하고자 하는 요소가 맞는지 확인
Comparable 인터페이스 사용
(((Comparable<E>) current.data).compareTo(obj) == 0); //두 객체가 같다는 의미이다
-> compareTo 메서드 오버라이딩 -> 객체들에 할당된 메모리 값을 비교
-> remove를 사용하는 상황에서는 올바른 방법이 아니다
제거하고자 하는 요소가 리스트의 맨 앞에 있는지 확인하기 위한 방법
- current가 head를 가리키는지 확인한다
- 다른 방법으로는 preivious가 null인지 확인한다
- current와 tail이 같은 곳을 가리킬 때 removeLast를 사용한다
previous, current 포인터 작성
public E remove(E obj) {
Node<E> current = head.previous = null;
while(current != null) {
//제거하려는 요소가 맞는지 확인
if(((Comparable<E>)obj).compareTo(current.data)==0) {
if(current == head) //첫 요소인지 확인
return removeFirst(); //head tail 비교
if(current == tail)
return removeLast();
currentSize--;
previous.next = current.next;
return current.data;
}
//찾고자 하는 요소를 찾은 후 첫 요소인지 마지막 요소인지 확인
previous = current;
current = current.next;
}
return null;
}
참고사항
1. removeFirst removeLast가 remove 메서드가 반환하는 객체와 같은 타입인지
확인해야 한다
2. if(current == tail)
return removeLast();
current가 tail인지 확인하는 코드가 필요한가?
3. 리스트가 비어있는 경우에는 별도의 코드 없이 while문으로 current 값이 null인지 확인하면 된다
주어진 객체가 아닌 연결리스트에 있는 객체를 반환하는 법 :
person객체를 추가하여 redid 값을 알아내야 한다
Contains메서드
public boolean contains(E obj)
public E remove(E obj) {
Node<E> current = head;
while(current != null) {
if(((Comparable<E>)obj).compareTo(current.data) == 0) {
return true;
}
current = current.next;
}
return false;