ํฐ์คํ ๋ฆฌ ๋ทฐ
728x90
๋ฐ์ํ
Linked List
๐ก Linked List๋?
- Linked List๋ ๊ฐ ๋
ธ๋๊ฐ ๋ฐ์ดํฐ์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ์
๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๊ฐ ๋
ธ๋๋ค์ ํฌ์ธํฐ๋ฅผ ํตํด ์ด์ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ฅผ ์ฐ๊ฒฐํ๊ณ ์๊ณ , ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์ญ์ ํ ๋ ํฌ์ธํฐ์ ์ฃผ์๊ฐ๋ง ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ฏ๋ก ๋ฐ์ดํฐ ์ฝ์
/์ญ์ ์ ์ฉ์ดํฉ๋๋ค.
๋ฐ๋ฉด ArrayList์ธ ๊ฒฝ์ฐ ์ค๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ /์ญ์ ์ ์ ์ฒด ์ธ๋ฑ์ค๊ฐ ํ ์นธ์ฉ ๋ค๋ก ๋ฐ๋ฆฌ๊ฑฐ๋ ๋น๊ฒจ์ง๋ฏ๋ก Linked List์ ๋นํด ์ฑ๋ฅ์ด ๋จ์ด์ง๋๋ค. - ๋ํ Linked List๋ ์ธ๋ฑ์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ํน์ ์์์ ์ ๊ทผํ๊ธฐ ์ํด์๋ ์์ฐจ ํ์์ด ํ์ํ๋ฏ๋ก ํ์ ์๋๊ฐ ๋ฆ์ด์ง๋ค๋ ๋จ์ ์ด ์์ต๋๋ค. ๋ฐ๋ฉด Array List๋ ์ธ๋ฑ์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ ํน์ ์์์ ์ ๊ทผํ๊ธฐ ์ฉ์ดํฉ๋๋ค.
๐ก Linked List์ ํ์ ๋ฐฐ๊ฒฝ
- LinkedList ํด๋์ค๋ ArrayList ํด๋์ค๊ฐ ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ์์๋ฅผ ์ ์ฅํจ์ผ๋ก์จ ๋ฐ์ํ๋ ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํด ๊ณ ์๋์์ต๋๋ค.
ArrayList๋ ๊ฐ ์์๊ฐ ์์ฐจ์ ์ผ๋ก ์ ์ฅ๋์ง๋ง LinkedList๋ ์ ์ฅ๋ ์์๊ฐ ๋น์์ฐจ์ ์ผ๋ก ๋ถํฌ๋๋ฉฐ, ๊ฐ ์์๋ค์ Link๋ก ์ฐ๊ฒฐํ์ฌ ๊ตฌ์ฑํ๊ณ ์์ต๋๋ค.
๐ก ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Singly Linked List)
- ๋ค์ ์์๋ง์ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ Linked List๋ฅผ ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ผ๊ณ ํ๋ฉฐ, ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์์์ ์ ์ฅ๊ณผ ์ญ์ ์์ ์ด ๋ค์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋ฏ๋ก ์์ฃผ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋ ์ ์์ง๋ง ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ์์์ ์์์ ์ ๊ทผํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.(randomAccess ๋ถ๊ฐ๋ฅ)
๐ก ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Doubly Linked List)
- ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ค์ ์์์ ์ฐธ์กฐ๊ฐ๋ง ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ์ด์ ์์๋ก ์ ๊ทผํ๋๋ฐ ๋งค์ฐ ์ด๋ ต๋ค๊ณ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ๋ ๊ฐ์ง ์ ์๋ ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค. JAVA์์ LinkedList๋ ArrayList์ ๋ฌ๋ฆฌ List ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ AbstractList๋ฅผ ์์ํ๋ ๊ฒ ์๋ AbstractSequentialList๋ฅผ ์์๋ฐ๋๋ค๊ณ ํฉ๋๋ค.
๐ก ์๊ฐ ๋ณต์ก๋
- ํ์
- ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
- ์ฝ์
- ์์ ์ด ์ถ๊ฐํ๋ ค๋ ์์น์ ์ด์ ๋ ธ๋๋ฅผ ์๋ ๊ฒฝ์ฐ O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง์ง๋ง ๋ชจ๋ฅด๋ ๊ฒฝ์ฐ์๋ ์ถ๊ฐํ๋ ค๋ ์์น์ ์ด์ ๋ ธ๋๋ฅผ ํ์ํด์ผ ํ๋ฏ๋ก O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
- ์ญ์
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ ์ ๊ฑฐํ ์์น์ ๋ ธ๋๋ง ์๋ค๋ฉด, ๋ฐ๋ก ์ด์ ๋ ธ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๋ ธ๋๋ฅผ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
- ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ ์ด์ ๋ ธ๋๋ก ๊ฐ๋ ํฌ์ธํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ ๊ฑฐํ๋ ค๋ ์์น๋ฅผ ์์๋ O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
- ์์
- ์ธ๋ฑ์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ธฐ ๋๋ฌธ์ ํน์ ๋ ธ๋๋ฅผ ์ผ๋จ ์ฐพ๊ณ ๋ฐ์ดํฐ๋ฅผ ์์ ํด์ผํ๊ธฐ ๋๋ฌธ์ O(n)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
Linked List ๊ตฌํ
- ๋ฐ์ดํฐ๊ฐ ์๋ ์์ ๋ ธ๋๋ฅผ ๊ฐ์ง๋๋ค. ์ฒซ ๋ ธ๋๋ ๋จ์ง, ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ญํ ๋ง ์ํํฉ๋๋ค.
๐ก Node ํด๋์ค
- ๊ฐ๊ฒฐํ๊ฒ ๋ณด๊ธฐ ์ํด @Getter, @Setter ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ์์ฑ์์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ๋ฐ๋ ์์ฑ์๊ฐ ์์ต๋๋ค.
@Getter
@Setter
public class Node {
private int data;
private Node next;
public Node() { }
public Node(int data) {
this.data = data;
}
}
๐ก Linked List ํด๋์ค
public class LinkedList {
private Node head;
public LinkedList() {
this.head = new Node();
}
/**
* ๋ง์ง๋ง์ ์๋ก์ด ๋
ธ๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
*/
public void append(int data) {
Node first = this.head;
Node tail = new Node(data);
while (first.getNext() != null) {
first = first.getNext();
}
first.setNext(tail);
}
/**
* ํน์ ์ธ๋ฑ์ค์ ์๋ก์ด ๋
ธ๋ ์ถ๊ฐ
*/
public void append(int index, int data) {
Node node = this.head.getNext();
Node newNode = new Node(data);
if (index == 0) {
this.head.setNext(newNode);
newNode.setNext(node);
} else {
for (int i = 0; i < index -1; i++) {
node = node.getNext();
}
newNode.setNext(node.getNext()); // ์๋ก์ด ๋
ธ๋๋ค์ ์ด์ด๋ถ์ด๊ธฐ
node.setNext(newNode); // ๊ธฐ์กด ๋
ธ๋ ๋ค์ ์๋ก์ด ๋
ธ๋ ๋ถ์ด๊ธฐ
}
}
/**
* ํน์ ์ธ๋ฑ์ค์ ๋
ธ๋ ์ญ์
*/
public void remove(int index) {
Node node = this.head.getNext();
if (0 == index) {
this.head.setNext(node.getNext());
} else {
for (int i = 0; i < index - 1; i++) {
node = node.getNext();
}
node.setNext(node.getNext().getNext());
}
}
/**
* ํน์ ๋
ธ๋ ์ญ์
*/
public void removeNode(Node node) {
if (node == null || node.getNext() == null) {
return;
}
Node next = node.getNext();
node.setData(next.getData());
node.setNext(next.getNext());
}
/**
* ํน์ ์ธ๋ฑ์ค์ Node ๋ฐํ
*/
public Node get(int index) {
Node first = this.head.getNext();
for (int i = 1; i <= index; i++) {
first = first.getNext();
}
return first;
}
/**
* ํน์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ
*/
public Node partition(int x) {
Node n = this.head.getNext();
Node head = n;
Node tail = n;
while (n != null) {
Node next = n.getNext();
if (n.getData() < x) {
n.setNext(head);
head = n;
} else {
tail.setNext(n);
tail = n;
}
n = next;
}
tail.setNext(null); // ๋ง์ง๋ง์์ ํ์ํ๊ธฐ ์ํด
return head;
}
/**
* ํ์ฌ ๋ชจ๋ ๋
ธ๋ ์ถ๋ ฅ
*/
public void print() {
Node first = this.head.getNext();
while (first.getNext() != null) {
System.out.print(first.getData() + " -> ");
first = first.getNext();
}
System.out.println(first.getData());
}
}
๐ก append(int data) ํจ์์ ํ๋ฆ
๐ก append(int index, int data) ํจ์์ ํ๋ฆ
- node ๋ณ์๋ ์ฒซ ์์์ ์ด ์๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋ ธ๋๋ฅผ ์์์ ์ผ๋ก ์ก์ต๋๋ค.
- ์ถ๊ฐํ๊ณ ์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒซ ์์์ ์ผ๋ก ์ก๋๋ค๋ฉด ์ฆ index๊ฐ 0์ด๋ผ๋ฉด, ์นํ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ์ ์๋ฆฌ๋ฅผ ๋ณ๊ฒฝํด์ค๋๋ค.
- ์๋ก์ด ๋ ธ๋ ๋ค์ ๊ธฐ์กด ๋ ธ๋๋ค์ ์ด์ด๋ถ์ ๋๋ค.
- ๊ธฐ์กด ๋ ธ๋์ ์๋ก์ด ๋ ธ๋๋ฅผ ์ด์ด ๋ถ์ ๋๋ค.
๐ก remove(int index) ํจ์์ ํ๋ฆ
- index๊ฐ 0์ด๋ผ๋ฉด ์์์ ์ ๋ ธ๋์ next๊ฐ 2๋ฒ์งธ ๋ ธ๋๋ถํฐ ์์๋๋๋ก ์ค์ ํฉ๋๋ค.
- index๊ฐ 0์ด ์๋๋ผ๋ฉด O(n)๋งํผ ์ํ ํ ๋ ธ๋์ next ์ฐ๊ฒฐ์ ์ ์์ ํด์ค๋๋ค.
๐ก removeNode(Node node) ํจ์์ ํ๋ฆ
- ์ญ์ ํ๋ ค๋ ๋ ธ๋์ ๋ค์ ๋ ธ๋๋ฅผ ์ฐพ์์ ์ด์ ๋ ธ๋์ ์ฐ๊ฒฐ์์ผ์ค๋๋ค.
Linked List ํ ์คํธ ๊ฒฐ๊ณผ
public class Main {
public static void main(String[] args) {
LinkedList linkedList = new LinkedList();
System.out.println("=====> ๋ง์ง๋ง์ ์๋ก์ด ๋
ธ๋ ์ถ๊ฐ <=====");
linkedList.append(1);
linkedList.append(2);
linkedList.append(3);
linkedList.append(4);
linkedList.append(5);
linkedList.print();
System.out.println("=====> ํน์ ์ธ๋ฑ์ค์ ์๋ก์ด ๋
ธ๋ ์ถ๊ฐ <=====");
linkedList.append(1, 10);
linkedList.print();
System.out.println("=====> ํน์ ์ธ๋ฑ์ค์ ๋
ธ๋ ์ญ์ <=====");
linkedList.remove(0);
linkedList.print();
System.out.println("=====> ํน์ ๋
ธ๋ ์ญ์ <=====");
linkedList.removeNode(linkedList.get(1));
linkedList.print();
System.out.println("=====> ํน์ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋๋๊ธฐ <=====");
Node n = linkedList.partition(5);
while (n.getNext() != null) {
System.out.print(n.getData() + " -> ");
n = n.getNext();
}
System.out.println(n.getData());
}
}
โ๏ธ ์ ๋ฆฌ
- Linked List๋ฅผ ๋ง๋ค์ด ๋ณด๋ฉด์ ํ์, ์ฝ์ , ์ญ์ ์ ์๊ฐ ๋ณต์ก๋์์ ์ O(n) ๋งํผ์ ์๊ฐ์ด ์์๋๋์ง ํ์ ํ ์ ์์์ต๋๋ค.
์ฐธ๊ณ ์๋ฃ)
https://www.youtube.com/@eleanorlim/playlists
https://www.nextree.co.kr/p6506/
728x90
๋ฐ์ํ
'์๋ฃ๊ตฌ์กฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์๋ฃ๊ตฌ์กฐ - LinkedHashSet (0) | 2022.12.10 |
---|---|
์๋ฃ๊ตฌ์กฐ - Hash Set (0) | 2022.12.07 |
์๋ฃ๊ตฌ์กฐ - Array List (0) | 2022.12.04 |
์๋ฃ๊ตฌ์กฐ - Doubly Linked List (0) | 2022.12.03 |
๊ณต์ง์ฌํญ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ
- Total
- Today
- Yesterday
TAG
- ํธ๋์ญ์ ๋ ์์๋ฐ์ค ํจํด ์คํ๋ง๋ถํธ
- pipeline architecture
- ํธ๋์ญ์ ๋ ์์๋ฐ์ค ํจํด ์คํ๋ง ๋ถํธ ์์
- redis sorted set์ผ๋ก ๋๊ธฐ์ด ๊ตฌํ
- transactional outbox pattern spring boot
- spring boot excel download paging
- spring boot poi excel download
- JDK Dynamic Proxy์ CGLIB์ ์ฐจ์ด
- spring boot ์์ ๋ค์ด๋ก๋
- spring boot redisson destributed lock
- java ThreadLocal
- spring boot redisson sorted set
- spring boot redis ๋๊ธฐ์ด ๊ตฌํ
- ๊ณต๊ฐ ๊ธฐ๋ฐ ์ํคํ ์ฒ
- ๋๋ค ํํ์
- space based architecture
- ๋ ์ด์ด๋ ์ํคํ ์ฒ๋
- @ControllerAdvice
- spring boot redisson ๋ถ์ฐ๋ฝ ๊ตฌํ
- microkernel architecture
- redis ๋๊ธฐ์ด ๊ตฌํ
- ์๋น์ค ๊ธฐ๋ฐ ์ํคํ ์ฒ
- spring boot excel download oom
- redis sorted set
- pipe and filter architecture
- polling publisher spring boot
- transactional outbox pattern
- service based architecture
- java userThread์ DaemonThread
- ์๋ฐ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ถ์ฒ ๋์
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
๊ธ ๋ณด๊ดํจ