find 메소드

nn·2022년 1월 30일
0

특정위치의 노드를 제거하고 싶을 땐, 먼저 특정위치가 어디인지 먼저 찾아야합니다.

find

현재 객체가 제거하려는 요소와 같은지 먼저 알아야 하기때문에 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;
}
profile
내가 될 거라고 했잖아

0개의 댓글