LinkedList는 데이터를 노드(Node)라는 단위로 연결해서 저장하는 연결형 자료구조. Java에서는 java.util.LinkedList 클래스로 제공되며, List, Deque, Queue 인터페이스를 구현한다.
✅ 자바의 LinkedList는 이중 연결 리스트(Doubly Linked List) 로 구현되어 있다.
| 비교 항목 | ArrayList | LinkedList |
|---|---|---|
| 내부 구조 | 배열 | 이중 연결 리스트 |
| 인덱스 접근 | 빠름 (O(1)) | 느림 (O(n)) |
| 삽입/삭제 | 느림 (O(n)) | 빠름 (O(1), 위치만 알면) |
| 메모리 사용량 | 적음 | 많음 (노드마다 포인터 필요) |
LinkedList<String> list = new LinkedList<>();
list.add("Apple"); // 맨 뒤에 추가
list.addFirst("Banana"); // 맨 앞에 추가
list.addLast("Cherry"); // 맨 뒤에 추가
list.remove(); // 맨 앞 제거
list.removeLast(); // 맨 뒤 제거
String first = list.getFirst(); // 첫 요소 조회
String last = list.getLast(); // 마지막 요소 조회
public class Main {
public static void main(String[] args) {
MyLinkedList list = new MyLinkedList();
list.add("A");
list.add("B");
list.add("C");
list.printList();
// 출력: A <-> B <-> C <-> null
}
}
class Node {
String data;
Node prev;
Node next;
Node(String data) {
this.data = data;
}
}
class MyLinkedList {
private Node head;
private Node tail;
public void add(String data) {
Node newNode = new Node(data);
if (head == null) {
head = tail = newNode;
} else {
tail.next = newNode;
newNode.prev = tail;
tail = newNode;
}
}
public void printList() {
Node curr = head;
while (curr != null) {
System.out.print(curr.data + " <-> ");
curr = curr.next;
}
System.out.println("null");
}
}
| 연산 | 시간 복잡도 |
|---|---|
| get(index) | O(n) |
| add/remove 첫/마지막 | O(1) |
| 중간 삽입/삭제 | O(n) |
요소의 삽입과 삭제가 빈번할 때
데이터를 순차적으로 처리하는 큐나 덱 구조가 필요할 때
인덱스 접근보다 요소의 순차 처리에 집중할 때
Java의 LinkedList는 이중 연결 리스트로 구현되어 있음
ArrayList보다 삽입/삭제는 빠르지만, 조회는 느림
상황에 따라 ArrayList vs LinkedList 를 적절히 선택할 것.