๋จ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ
๊ฐ๋
โข
๋จ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ(Singly Linked List) ๋ ๊ฐ ๋
ธ๋๊ฐ ๋ฐ์ดํฐ(data) ์ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฐธ์กฐ(next) ๋ฅผ ๊ฐ๋ ์ ํ ์๋ฃ๊ตฌ์กฐ์
๋๋ค.
โข
๋ฐฐ์ด๊ณผ ๋ฌ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฐ์์ผ ํ์๊ฐ ์๊ณ , ๋
ธ๋๋ค์ด ํฌ์ธํฐ(์ฐธ์กฐ)๋ก ์ฐ๊ฒฐ๋ฉ๋๋ค.
โข
๋ณดํต ๋ค์๊ณผ ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ ์งํฉ๋๋ค.
โฆ
head: ๋ฆฌ์คํธ์ ์ฒซ ๋
ธ๋
โฆ
(์ ํ) tail: ๋ฆฌ์คํธ์ ๋ง์ง๋ง ๋
ธ๋(์ถ๊ฐ ์ฐ์ฐ ์ต์ ํ)
์ฅ๋จ์ (์๊ฐ ๋ณต์ก๋)
โข
์ฅ์
โฆ
์ค๊ฐ ์ฝ์
/์ญ์ ๊ฐ ํฌ์ธํฐ ๋ณ๊ฒฝ์ผ๋ก ๊ฐ๋ฅ(๋
ธ๋๋ฅผ ์ด๋ฏธ ์ฐพ์๋ค๋ ์ ์ ์์ O(1))
โฆ
ํฌ๊ธฐ ๋ณ๊ฒฝ์ด ์์ ๋ก์(ํ์ํ ๋งํผ ๋
ธ๋๋ฅผ ๋์ ์์ฑ)
โข
๋จ์
โฆ
์ธ๋ฑ์ค ์ ๊ทผ ๋ถ๊ฐ โ k๋ฒ์งธ ์ ๊ทผ์ ์์ฐจ ํ์ O(n)
โฆ
๋
ธ๋๋ง๋ค ์ฐธ์กฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก ์ถ๊ฐ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋ ์กด์ฌ
์์ฃผ ์ฐ๋ ์ฐ์ฐ์ ํ๊ท ์ ๋น์ฉ(๋จ์ ์ฐ๊ฒฐ๋ฆฌ์คํธ):
โข
๋งจ ์ ์ฝ์
(pushFront): O(1)
โข
๋งจ ์ ์ญ์ (popFront): O(1)
โข
ํ์(search): O(n)
โข
๋งจ ๋ค ์ฝ์
(pushBack): tail ์ด ์์ผ๋ฉด O(1), ์์ผ๋ฉด O(n)
Java๋ก ์ง์ ๊ตฌํ ์์
public class SinglyLinkedList<E> {
private static class Node<E> {
E data;
Node<E> next;
Node(E data) { this.data = data; }
}
private Node<E> head;
private Node<E> tail; // ์์ ๋ ๋์ง๋ง, ์์ผ๋ฉด ๋งจ ๋ค ์ถ๊ฐ๊ฐ ๋นจ๋ผ์ง
private int size;
public int size() { return size; }
public boolean isEmpty() { return size == 0; }
// ๋งจ ์์ ์ฝ์
public void addFirst(E value) {
Node<E> node = new Node<>(value);
node.next = head;
head = node;
if (tail == null) tail = head;
size++;
}
// ๋งจ ๋ค์ ์ฝ์
public void addLast(E value) {
Node<E> node = new Node<>(value);
if (head == null) {
head = tail = node;
} else {
tail.next = node;
tail = node;
}
size++;
}
// ์ฒซ ์์ ์ญ์ ํ ๋ฐํ
public E removeFirst() {
if (head == null) throw new IllegalStateException("empty");
E val = head.data;
head = head.next;
if (head == null) tail = null;
size--;
return val;
}
// value๊ฐ ์๋์ง ์์ฐจ ํ์
public boolean contains(E value) {
for (Node<E> cur = head; cur != null; cur = cur.next) {
if ((value == null && cur.data == null) ||
(value != null && value.equals(cur.data))) return true;
}
return false;
}
}
Java
๋ณต์ฌ
Mermaid๋ก โ๋ ธ๋(ํฌ์ธํฐ)โ ํํํ๊ธฐ
Mermaid์์๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ๋ฅผ ๋ณดํต ๋ฐฉํฅ ๊ทธ๋ํ ๋ก ํํํฉ๋๋ค.
โข
๋
ธ๋: ์ฌ๊ฐํ(๋๋ ์ํ๋ ๋ชจ์)
โข
next ํฌ์ธํฐ: ํ์ดํ -->
โข
null: ์ข
๋จ ๋
ธ๋๋ฅผ null ๋ก ์ฐ๊ฒฐํด์ ๋์ ํํ
์์ 1) ๊ธฐ๋ณธ ์ฐ๊ฒฐ
flowchart LR
head((head)) --> n1["Node 1<br>data: 10"]
n1 --> n2["Node 2<br>data: 20"]
n2 --> n3["Node 3<br>data: 30"]
n3 --> null((null))Mermaid
๋ณต์ฌ
์์ 2) head๊ฐ ๊ฐ๋ฆฌํค๋ โ์ฐธ์กฐ(๋ณ์)โ๊น์ง ๋ช ์
flowchart LR
headRef["head"] --> n1["data: A"]
n1 -- next --> n2["data: B"]
n2 -- next --> n3["data: C"]
n3 -- next --> null((null))Mermaid
๋ณต์ฌ
์์ 3) tail์ ํจ๊ป ํํ(์ ํ)
flowchart LR
headRef["head"] --> n1["data: 1"]
n1 --> n2["data: 2"]
n2 --> n3["data: 3"]
tailRef["tail"] --> n3
n3 --> null((null))Mermaid
๋ณต์ฌ
ํ:
โข
๋
ธ๋ ์์์ ์ค๋ฐ๊ฟ์ \n ๋์
๋ฅผ ์ฐ๋ฉด ์์ ์ ์ผ๋ก ๋ ๋๋ง๋ฉ๋๋ค.
โข
์ฐ๊ฒฐ ๋ฐฉํฅ์ ์ผโ์ค๋ก ๋ณด๋ ค๋ฉด flowchart LR, ์โ์๋๋ฉด flowchart TD ๋ฅผ ์ฌ์ฉํฉ๋๋ค.




