특정위치의 노드를 제거하고 싶을 땐, 먼저 특정위치가 어디인지 먼저 찾아야합니다.
현재 객체가 제거하려는 요소와 같은지 먼저 알아야 하기때문에 comparable 인터페이스를 사용하겠습니다.
current.data를 현재 객체와 compareTo를 해서 0이나오면 두 객체가 같다는 것을 알 수 있습니다.
comparable인터페이스는 compareTo 메소드를 오버라이딩 합니다.
만약 compareTo가 아닌 등호를 사용해 비교하면 이 객체들의 메모리 값을 비교하기 때문에 올바른 방법이 아닙니다.
compareTo를 사용해 찾고자 하는 객체를 찾았으면 제거를 해야합니다.
제거하려는 노드가 current고 이전 노드가 previous인 상황에서
previous.next가 current를 아닌 그 뒤에 있는 노드를 가르키면 B와 C사이의 관계가 없어지고 가비지 컬랙션의 대상이 됩니다. previous.next=current.next
경계조건을 살펴보겠습니다.
요소가 하나만 있고, 제거하고자 하는 요소가 이 요소일 때입니다.
이 경우엔 removeFirst하듯이 하면 됩니다.
removeFirst를 하면됩니다.
removeLast를 하면됩니다.
public E remove(E obj){
Node<E> current = head;
head.previous = null;
while(current != null) {
if (((Comparable<E>) obj).compareTo(current.data)==null) { // 1. find
if (current==head) // 노드가 1개 or 첫 번째 노드 제거
return removeFirst();
if (current==tail) // 마지막 노드 제거
return removeLast();
currentsize--;
previous.next=current.next; // 2. remove
return current.data;
}
previous = current;
current = current.next;
}
return null;
}