
난이도: ★☆☆☆☆ • solved on: 2025-11-08

자료구조
DoublyLinkedListNodeprev와 next 포인터를 동시에 가지는 노드 구조알고리즘/기법
핵심 키워드
prev / next 연결 관리
- 문제 분해
- 삽입할 위치를 찾기 위해 리스트를 순회한다.
- 삽입 위치는
현재 노드의 값 ≤ data ≤ 다음 노드의 값인 곳이다.- 새 노드를 중간에 넣을 때는
prev/next를 모두 재연결해야 한다.- 맨 앞이나 맨 뒤 삽입 시 예외 처리를 별도로 수행한다.
핵심 로직 흐름
if (data <= head.data) // 맨 앞 삽입 else // 중간 또는 끝 탐색 while (current != null) if (current.next == null) // 맨 뒤 삽입 else if (current.data <= data <= current.next.data) // 중간 삽입예외 처리
- 리스트의 맨 앞: 기존 head보다 작은 값일 때 새 노드를 head로 지정
- 리스트의 맨 뒤: 마지막 노드의
next가 null인 경우 연결 처리
public static DoublyLinkedListNode sortedInsert(DoublyLinkedListNode llist, int data) {
DoublyLinkedListNode llistCurrent = llist;
DoublyLinkedListNode newItem = new DoublyLinkedListNode(data);
// Case 1: 맨 앞에 삽입
if (data <= llist.data) {
newItem.next = llist;
llist.prev = newItem;
return newItem;
}
// Case 2: 중간 또는 맨 뒤 탐색
while (llistCurrent != null) {
// 마지막 노드일 경우 (맨 뒤 삽입)
if (llistCurrent.next == null) {
llistCurrent.next = newItem;
newItem.prev = llistCurrent;
break;
}
// 중간 삽입
if (llistCurrent.data <= data && data <= llistCurrent.next.data) {
newItem.next = llistCurrent.next;
llistCurrent.next.prev = newItem;
llistCurrent.next = newItem;
newItem.prev = llistCurrent;
break;
}
llistCurrent = llistCurrent.next;
}
return llist;
}
NullPointerException이 발생했다.next가 null일 수 있다는 점을 간과했다.이중 연결 리스트에서는 prev와 next 양쪽 포인터를 모두 업데이트해야 한다. → 순서에 주의
연결 리스트 삽입 로직은 단순하지만, 포인터 연결 순서가 꼬이면 쉽게 오류가 발생하므로 단계적으로 디버깅하는 습관이 중요하다.
비슷한 유형 (GPT 추천):
확장 문제 (GPT 추천):