링크드 리스트(Linked List)는 데이터를 순차적으로 저장하는 배열과 달리, 떨어진 메모리 공간에 존재하는 데이터를 화살표(포인터)로 연결해서 관리하는 데이터 구조이다. 이 구조는 데이터의 동적 추가, 삭제에 유리하지만, 특정 위치의 데이터 검색에는 비효율적일 수 있다.
null
을 가리킨다.public class Node {
int data;
Node next;
public Node(int data) {
this.data = data;
this.next = null;
}
}
public class LinkedList {
Node head;
public LinkedList() {
this.head = null;
}
public void append(int data) {
if (head == null) {
head = new Node(data);
} else {
Node current = head;
while (current.next != null) {
current = current.next;
}
current.next = new Node(data);
}
}
public void printList() {
Node current = head;
while (current != null) {
System.out.print(current.data + " ");
current = current.next;
}
System.out.println();
}
}
LinkedList 클래스는 head 노드를 가지고 있으며, 노드를 리스트 끝에 추가하는 append 메소드와 리스트의 모든 노드를 출력하는 printList 메소드를 포함한다.
public class LinkedListTest {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.append(1);
linkedList.append(2);
linkedList.append(3);
linkedList.printList(); // 출력: 1 2 3
}
}
public class LinkedList {
Node head;
public LinkedList() {
this.head = null;
}
public void append(int data) {
if (head == null) {
head = new Node(data);
} else {
Node current = head;
while (current.next != null) {
current = current.next;
}
current.next = new Node(data);
}
}
public void insert(int data, int position) {
Node newNode = new Node(data);
if (position == 0) {
newNode.next = head;
head = newNode;
} else {
Node current = head;
for (int i = 0; i < position - 1; i++) {
if (current != null) {
current = current.next;
} else {
throw new IndexOutOfBoundsException("Position out of range");
}
}
newNode.next = current.next;
current.next = newNode;
}
}
public void delete(int data) {
if (head != null && head.data == data) {
head = head.next;
} else {
Node current = head;
while (current != null && current.next != null && current.next.data != data) {
current = current.next;
}
if (current != null && current.next != null) {
current.next = current.next.next;
} else {
throw new IllegalArgumentException("Value not found in the list");
}
}
}
public void printList() {
Node current = head;
while (current != null) {
System.out.print(current.data + " ");
current = current.next;
}
System.out.println();
}
}
public class LinkedListTest {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
linkedList.append(1);
linkedList.append(2);
linkedList.append(3);
linkedList.printList(); // 출력: 1 2 3
linkedList.insert(4, 0);
linkedList.printList(); // 출력: 4 1 2 3
linkedList.insert(5, 2);
linkedList.printList(); // 출력: 4 1 5 2 3
linkedList.delete(1);
linkedList.printList(); // 출력: 4 5 2 3
linkedList.delete(4);
linkedList.printList(); // 출력: 5 2 3
}
}
public class Node {
int data;
Node prev;
Node next;
public Node(int data) {
this.data = data;
this.prev = null;
this.next = null;
}
}
public class DoubleLinkedList {
Node head;
Node tail;
public DoubleLinkedList() {
this.head = null;
this.tail = null;
}
public void append(int data) {
if (head == null) {
head = new Node(data);
tail = head;
} else {
Node newNode = new Node(data);
tail.next = newNode;
newNode.prev = tail;
tail = newNode;
}
}
public void insert(int data, int position) {
Node newNode = new Node(data);
if (position == 0) {
newNode.next = head;
if (head != null) {
head.prev = newNode;
}
head = newNode;
if (tail == null) {
tail = newNode;
}
} else {
Node current = head;
for (int i = 0; i < position - 1; i++) {
if (current != null) {
current = current.next;
} else {
throw new IndexOutOfBoundsException("Position out of range");
}
}
newNode.next = current.next;
if (current.next != null) {
current.next.prev = newNode;
}
current.next = newNode;
newNode.prev = current;
if (newNode.next == null) {
tail = newNode;
}
}
}
public void delete(int data) {
Node current = head;
while (current != null) {
if (current.data == data) {
if (current.prev != null) {
current.prev.next = current.next;
} else {
head = current.next;
}
if (current.next != null) {
current.next.prev = current.prev;
} else {
tail = current.prev;
}
return;
}
current = current.next;
}
throw new IllegalArgumentException("Value not found in the list");
}
public void printList() {
Node current = head;
while (current != null) {
System.out.print(current.data + " ");
current = current.next;
}
System.out.println();
}
}
public class DoubleLinkedListTest {
public static void main(String[] args) {
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();
doubleLinkedList.append(1);
doubleLinkedList.append(2);
doubleLinkedList.append(3);
doubleLinkedList.printList(); // 출력: 1 2 3
doubleLinkedList.insert(4, 0);
doubleLinkedList.printList(); // 출력: 4 1 2 3
doubleLinkedList.insert(5, 2);
doubleLinkedList.printList(); // 출력: 4 1 5 2 3
doubleLinkedList.delete(1);
doubleLinkedList.printList(); // 출력: 4 5 2 3
doubleLinkedList.delete(4);
doubleLinkedList.printList(); // 출력: 5 2 3
}
}
링크드 리스트는 데이터의 동적 추가와 삭제에 유리한 자료 구조이다. 그러나 특정 위치의 데이터를 검색하는 데는 비효율적일 수 있다. 링크드 리스트의 여러 형태(단방향, 양방향, 원형)는 다양한 요구 사항에 맞게 사용될 수 있다. 각 형태는 데이터의 삽입, 삭제, 검색에 대해 서로 다른 성능 특성을 가지며, 사용 목적에 맞는 형태를 선택하는 것이 중요하다.