find 메소드

nn·2022년 1월 30일

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

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개의 댓글