연결 리스트
포인터로 연결 리스트 만들기
생성자 LinkedList
-
연결 리스트 클래스
LinkedList<E>
의 생성자는
노드가 하나도 없는 비어있는 연결 리스트를 생성함 -
머리 포인터 head에 null을 대입함
-
연결 리스트가 비어 있는지 판단하는 방법
- (a)는 노드가 하나도 없는 상태 (빈 연결 리스트)
head == null
- (a)는 노드가 하나도 없는 상태 (빈 연결 리스트)
-
노드가 1개인 연결 리스트를 판단하는 방법
- (b)는 head가 가리키는 노드가 갖고 있는 뒤쪽 포인터값이
null이므로 연결 리스트의 노드가 1개 뿐인지 판단하는 방법은 다음과 같음
head.next == null
- (b)는 head가 가리키는 노드가 갖고 있는 뒤쪽 포인터값이
-
노드가 2개인 연결 리스트를 판단하는 방법
- (c)는 머리 노드는 A, 꼬리 노드는 B
- 꼬리 노드 B의 next는 null 값을 가지고 있기 때문에
연결 리스트의 노드가 2개인지 판단하는 방법은 다음과 같음head.next.next == null
-
꼬리 노드인지 판단하는 방법
Node<P>
형의 변수 p가 리스트의 노드 중 하나를 가리킬 때 변수 p가 가리키는 노드가 연결리스 트의 꼬리 노드인지
판단하는 방법은 다음과 같음p.next == null
검색을 수행하는 메서드 search
-
검색에 사용하는 알고리즘은 선형 검색이고 검색하는 노드를 만날 때까지 머리 노드부터 순서대로 스캔함
public P search(E obj, Comparator<? super P>c) {
Node<P> ptr = head;
while (ptr != null) {
if (c.compare(obj, ptr.data) == 0) {
crnt = ptr
return ptr.data;
}
ptr = ptr.next;
}
return null;
} -
노드 스캔은 다음 조건 중 어느 하나가 성립하면 종료됨
-
종료 조건 1
검색 조건을 만족하는 노드를 찾지 못하고 꼬리 노드를 지나가기 직전인 경우 -
종료 조건 2
검색 조건을 만족하는 노드를 찾은 경우
-
머리에 노드를 삽입하는 메서드 addFirst
public void addFirst(E obj) {
Node<E> ptr = head;
head = crnt = new Node<E>(obj, ptr);
}
꼬리에 노드를 삽입하는 메서드 addLast
- 리스트가 비어 있는지 아닌지(head == null) 먼저 확인하고 경우에 따라 다음과 같이 처리함
public void addLast(E obj) {
if (head == null)
addFirst(obj);
else {
Node<E> ptr = head;
while (ptr.next != null)
ptr = ptr.next;
ptr.next = crnt = new Node<E>(obj, null);
}
}
리스트가 비어 있는 겨웅
- 리스트 머리에 노드를 삽입함
- addFirst 메서드로 처리함
리스트가 비어 있지 않은 경우
- 리스트 꼬리에 노드 G를 삽입함
머리 노드를 삭제하는 메서드 removeFist
- removeFirst 메서드는 머리 노드를 삭제함
- 리스트가 비어 있지 않을(head != null) 때만 삭제할 수 있음
public void removeFirst() {
if (head != null)
head = crnt = head.next;
}
꼬리 노드를 삭제하는 메서드 removeLast
public void removeFirst() {
if (head != null) {
if (head.next == null)
head = crnt = null;
else {
Node<E> ptr = head;
Node<E> pre = head;
while (ptr.next != null) {
pre = ptr;
ptr = ptr.next;
}
pre.next = null;
crnt = pre;
}
}
}
리스트에 노드가 1개만 있는 경우
- 머리 노드를 삭제함
- removeFirst 메서드로 처리함
리스트가 비어 있지 않은 경우
- 리스트 꼬리에 노드 F를 삭제함