1. 연결 리스트(Linked List)란?
- 배열과 함께 가장 기본이 되는 대표적인 선형 자료구조 중 하나로, 다양한 추상 자료형 구현의 기반이 된다.
- 순서대로 저장하는 배열과 다르게 데이터의 순서가 메모리에 물리적인 순서대로 저장되지는 않는다.
- 어떤 데이터 덩어리(이하 노드(Node))를 저장할 때 그 다음 순서의 자료가 있는 위치를 데이터에 포함시키는 방식으로 자료를 저장한다.
- 연결 구조를 통해 물리 메모리를 연속적으로 사용하지 않아도 되기 때문에 관리도 쉽다.
- 특정 인덱스에 접근하려고 할 때 전체를 순서대로 읽어야 하기 때문에 시간 복잡도는 O(n) 이다.
- 반면, 시작/끝 지점에 엘리멘트를 추가, 삭제, 추출하는 작업의 시간 복잡도는 O(1) 이다.
2. 자.알.인에서의 연결 리스트 문제
- 위의 설명에서 '어떤 데이터 덩어리'를 저장 할 때 그 다음 순서의 자료가 있는 위치를 데이터에 포함시키는 방식 이라는 객체를 만들어야 했습니다.
- 자.알.인에서 사용해야하는 'ListNode' 라는 커스텀 객체를 만들게 되었습니다.
import java.util.Objects;
public class ListNode {
public int val;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
public static ListNode of(int... integers) {
if (integers == null || integers.length == 0) throw new IllegalArgumentException();
ListNode head = new ListNode(0);
ListNode last = head;
ListNode p;
for (int integer : integers) {
p = new ListNode(integer);
last.next = p;
last = last.next;
}
return head.next;
}
@Override
public String toString() {
return "ListNode{" +
"val=" + val +
", next=" + next +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof ListNode)) return false;
ListNode listNode = (ListNode) o;
return val == listNode.val &&
Objects.equals(next, listNode.next);
}
@Override
public int hashCode() {
return Objects.hash(val, next);
}
}
- https://jaime-note.tistory.com/66 를 참고하여 만들었습니다. of 기능을 추가하여 기본 예제의 값을 한번에 넣을 수 있도록 설정했습니다.
- ListNode 자체를 어떻게 사용해야 할지 처음에는 감이 안 잡혔으나 풀어 본 결과로는 선형 자료구조이기 때문에 배열과 다르게 Index를 꺼내는 형식이 아니라 새 ListNode 객체를 꺼내어 next라는 이름을 붙이며 원형 ListNode를 갱신하는 식이었습니다. 마치 for문 문제에서 temp라는 타입을 통해 순서를 변경하는 것과 같은 느낌입니다.
3. 본인이 알고 있는 문제의 연결 리스트
- Java에서 연결 리스트라고 생각이 떠오르는 건 'LinkedList' 를 떠오르게 되었습니다.
- LinkedList는 Collection 프레임워크의 일부이며 java.util 패키지에 속되어 있습니다.
// LinkedList 내의 Node 클래스
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
- 안에 Node(데이터 덩어리)가 있으며 위의 개념을 따라 사용되고 있습니다. 다만 prev라는 개념도 추가되어 앞/뒤의 Node 객체를 확인 할 수 있습니다.
- 풀어본 문제에서 매우 쉬운 방법으로는 LinkedList<Integer>로 Input 값을 정의하는 것이었습니다. Deque의 First와 Last를 사용할 수 있어 ListNode처럼 수동적이지 않고 앞, 뒤의 값을 추가, 삭제, 추출이 가능했습니다. (Ex. addFirst(E), addLast(E), pollFirst(), pollLast(), peekFirst(), peekLast())
- 좀 더 이를 이용해 상세하게 풀려면 10장의 Deque, 우선순위 큐에서 다뤄봐야할 내용이기에 나중에 정리 할 수 있으면 블로그에 남기겠습니다.
- 공식문서 :
LinkedList (Java Platform SE 8 )
Returns a list-iterator of the elements in this list (in proper sequence), starting at the specified position in the list. Obeys the general contract of List.listIterator(int). The list-iterator is fail-fast: if the list is structurally modified at any tim
docs.oracle.com
'개발 > Java' 카테고리의 다른 글
[자.알.인] CH19. 비트 조작 (1) | 2024.02.06 |
---|---|
[자.알.인] CH16. 트라이 (1) | 2024.01.22 |