들어가기 전에
연결 리스트의 첫 node를 제거하는 removeFirst 메소드에 대해 살펴보도록 하겠습니다.
학습 목표
removeFirst 메소드를 이해하고 경계 조건을 만족하는지 확인할 수 있습니다.
핵심 단어
- removeFirst 메소드
- 연결 리스트
- 경계 조건
강의 듣기
들어가기 전에
연결 리스트의 첫 node를 제거하는 removeFirst 메소드에 대해 살펴보도록 하겠습니다.
학습 목표
removeFirst 메소드를 이해하고 경계 조건을 만족하는지 확인할 수 있습니다.
핵심 단어
강의 듣기
removeFirst 메소드
보통의 경우, head=head.next를 하면 head가 다음 노드를 가리키게 되고 첫 번째 노드가 제거됩니다. 하지만 다음과 같은 경계 조건에서 에러가 발생하므로 코드를 추가해야 합니다.
경계 조건 1. 자료 구조가 비어있는 경우
head가 null을 가리키는 경우입니다. 이 때, head가 head.next를 가리키게 하면 NullPointerException 에러가 발생하게 됩니다. 그래서 이 상황에서는 아무것도 하지 않고 null을 반환하면 됩니다.
경계 조건 2. 자료 구조에 단 하나의 요소가 들어있을 때
head 포인터, tail 포인터 모두 null을 가리키게 해야 합니다.
코드를 작성하면 다음과 같습니다.
public E removefirst(){
// 경계 조건 1
if (head == null)
return null;
E tmp = head.data;
// 경계 조건 2
if (head == tail) // head.next == null, currentSize == 1도 가능
head = null;
tail = null;
// 그 외의 경우
else
head = head.next;
currentSize--;
}
생각해보기
1) tail 포인터의 단점은 무엇인가요?
comment
리스트에 single element가 있는 경우, head와 tail 둘다 그 요소를 가르키고 있다. 이런경우 head와 tail 둘다 null을 가르키도록 바꿔야하고 그렇게 해야지 garbage collection이 일어나면서 요소가 없어진다
시간복잡도가 n(1) = 상수가 되는 장점이 있지만, 따로 구현해야하는 단점이 있다.
영상 밑 스크립트에 return tmp; 가 빠져있습니다.
구현이 복잡해진다.
tail 포인터 덕분에 상수 시간으로 리스트에 추가 할 수 있지만 구현이 복잡해 질 수 있다. (ex 요소가 한 개 일 때)