๋ฆฌ์คํธ์๋ ์ฐ์ํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ์ฅ๋์ด ์๋ ArrayList
์
๊ฐ๊ฐ์ ๋ฐ์ดํฐ์์ ๋ค์ ๋ฐ์ดํฐ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์์ด ์ฐ๊ฒฐ๋๋ LinkedList
๊ฐ ์๋ค.
๊ฐ ์๋ฃ๊ตฌ์กฐ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ๋ค.
1๏ธโฃ ArrayList
1. ๋ฐ์ดํฐ๊ฐ ์ฐ์์ ์ผ๋ก ๋์ด๋์ด ์์ด, ํน์ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ ๊ฒฝ์ฐO(1)
๋ก ์ ๊ทผํ ์ ์๋ค.
2. ์ ํ ํ์์ ๊ฒฝ์ฐO(n)
, ์ ๋ ฌ๋์ด ์์ ๋ ์ด๋ถํ์์ ๊ฒฝ์ฐO(logN)
์ผ๋ก ์ ๊ทผํ ์ ์๋ค.
3. ์ค๊ฐ ์์น์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ · ์ญ์ ํ๋ ๊ฒฝ์ฐ, ๋๋จธ์ง ์์๋ค์ ์์น๋ฅผ ์ฎ๊ฒจ์ผ ํ๊ธฐ ๋๋ฌธ์O(N)
์ด๋ค.
2๏ธโฃ LinkedList
1. ํน์ ์ธ๋ฑ์ค์ ์์นํ ์์์ ์ ๊ทผํ๋ ๊ฒฝ์ฐ์, ์ํ๋ฅผ ํด์ ์ฐพ์์ผ ํ๋ฏ๋กO(N)
์ด๋ค.
2. ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ, ์์ ๋ถ๋ถ์ ์ฝ์ · ์ญ์ ๋O(1)
์ ๊ฐ๋ฅํ๋ค.
3. ๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฒฝ์ฐ, ์ค๊ฐ ๋ถ๋ถ์ ์ฝ์ · ์ญ์ ๋ ํด๋น ๋ ธ๋๊น์ง ์ด๋ํด์ผํ๋ฏ๋กO(N)
์ด๋ค.
4. ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋, ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ์ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ๊ณ ์ ๋ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ด ํจ์จ์ ์ด๋ค.
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ(Singly Linked List) ๊ตฌํ
๋จ์ผ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก, ์ฒซ ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ head
์ ๋ง์ง๋ง ๋ฐ์ดํฐ๋ฅผ ์ฐธ์กฐํ๋ tail
๋ฅผ ๊ฐ๋๋ก ๊ตฌํํ๋ค.
์ด๋ก์จ, ๋ฆฌ์คํธ์ ์ฒซ๋ฒ์งธ๋ ๋ง์ง๋ง ๋ฐ์ดํฐ์ ๋ณํ๋ฅผ ์ค ๋, O(1) ๋ก ์ํํ ์ ์๊ฒ ๋๋ค.
Node ํด๋์ค ์ ์
class Node<E>{
public E data;
public Node<E> next;
public Node(E data) {
this.data = data;
this.next = null;
}
public Node(E data, Node<E> next) {
this.data = data;
this.next = next;
}
}
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ Node
์์ ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ
Node
์ Node
๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
SinglyLinkedList ํด๋์ค ์ ์
public class SinglyLinkedList<E> {
private Node<E> head;
private Node<E> tail;
private int size = 0;
public SinglyLinkedList() {
this.head = this.tail = null;
}
}
SinglyLinkedList
๋ head
๋
ธ๋์ tail
๋
ธ๋๋ฅผ ์ฐธ์กฐ๋ฅผ ์ํ ๋ณ์์ ๋ฆฌ์คํธ ๋ด์ ์์ ๊ฐ์๋ฅผ ์ฒดํฌํ๊ธฐ ์ํ size
๋ณ์๋ฅผ ๊ฐ๋๋ค.
addFirst(E e) ๋ฉ์๋
๋จผ์ , ๋ฆฌ์คํธ์ ์ ์ผ ์์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
head
๋ ธ๋๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐ- ์ถ๊ฐํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋
Node
๋ฅผ ์ ์ํ๊ณ , ๊ทธNode
์next
๋ณ์์head
๋ฅผ ์ฐธ์กฐํ๋๋ก ํ๋ค. - ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์คํธ์
head
์ ์๋กญ๊ฒ ์ถ๊ฐํNode
๋ฅผ ์ฐธ์กฐํ๋๋ก ๋ณ๊ฒฝํ๋ค.
- ์ถ๊ฐํ๋ ค๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋
head
๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ- ์๋กญ๊ฒ ์ถ๊ฐํ๋ ค๋ ๋
ธ๋๋ฅผ
head
์ ๋ฐ๋ก ์ฐธ์กฐํ๋๋ก ํ๋ค. head
๋ ธ๋๊ฐ ์์ง ์๋ ๊ฒฝ์ฐ๋, ๋ฆฌ์คํธ๊ฐ ๋น์ด์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ์๋กญ๊ฒ ์ถ๊ฐํ๋ ๋ ธ๋๋ฅผtail
๋ณ์๋ ์ฐธ์กฐํ๋๋ก ๋ง๋ ๋ค.
- ์๋กญ๊ฒ ์ถ๊ฐํ๋ ค๋ ๋
ธ๋๋ฅผ
- ์ถ๊ฐ ํ,
size
๋ณ์๋ฅผ 1 ์ฆ๊ฐํ๋ค.
public void addFirst(E e) {
final Node node = new Node(e);
if (head == null) {
this.head = node;
this.tail = node
} else {
node.next = this.head;
this.head = node;
}
this.size++;
}
addLast(E e) ๋ฉ์๋
๋ฆฌ์คํธ์ ๋ง์ง๋ง์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
tail
๋ ธ๋๊ฐ ์ด๋ฏธ ์กด์ฌํ๋ ๊ฒฝ์ฐtail
์ ์์นํ ๋ ธ๋์next
๋ณ์์ ์๋กญ๊ฒ ์ถ๊ฐํ๋ ๋ ธ๋๋ฅผ ์ฐธ์กฐํ๋๋ก ๋ง๋ ๋ค.- ๋ฆฌ์คํธ์
tail
๋ณ์์ ์๋กญ๊ฒ ์ถ๊ฐํ๋ ๋ ธ๋๋ฅผ ์ฐธ์กฐํ๋๋ก ๋ง๋ ๋ค.
tail
๋ ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ- ์๋กญ๊ฒ ์ถ๊ฐํ๋ ๋
ธ๋๋ฅผ
tail
๋ณ์๊ฐ ์ฐธ์กฐํ๋๋ก ๋ง๋ ๋ค. tail
๋ ธ๋๊ฐ null ์ด๋ผ๋ ์๋ฏธ๋, ๋ฆฌ์คํธ๊ฐ ๋น์ด์๋ค๋ ๋ป์ด๋ฏ๋กhead
๋ณ์๋ ์ฐธ์กฐํ๋๋ก ๋ง๋ ๋ค.
- ์๋กญ๊ฒ ์ถ๊ฐํ๋ ๋
ธ๋๋ฅผ
- ์ถ๊ฐ ํ,
size
๋ณ์๋ฅผ 1 ์ฆ๊ฐํ๋ค.
public void addLast(E e) {
final Node node = new Node(e);
if (this.tail == null) {
this.tail = node;
this.head = node;
} else {
this.tail.next = node;
this.tail = node;
}
this.size++;
}
get(int idx) ๋ฉ์๋
ํน์ ์ธ๋ฑ์ค์ Node๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
idx
๊ฐ ๋ฆฌ์คํธsize
๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐ- ํด๋น ์ธ๋ฑ์ค์ ๋ ธ๋๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์์ธ์ฒ๋ฆฌ ํด์ค๋ค.
idx
๊ฐ 0๋ณด๋ค ์์ ๊ฒฝ์ฐ- 0๋ณด๋ค ์์ ์ธ๋ฑ์ค๋ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์์ธ์ฒ๋ฆฌ ํด์ค๋ค.
idx
๊ฐsize-1
๊ณผ ๋์ผํ ๊ฒฝ์ฐ- ๋ง์ง๋ง
Node
์ด๋ฏ๋กtail
๋ณ์๊ฐ ์ฐธ์กฐํ๋Node
๋ฅผ ๋ฐํํ๋ค.
- ๋ง์ง๋ง
- idx ๊ฐ 0์ธ ๊ฒฝ์ฐ
- ์ฒซ๋ฒ์งธ
Node
์ด๋ฏ๋กhead
๋ณ์๊ฐ ์ฐธ์กฐํ๋Node
๋ฅผ ๋ฐํํ๋ค.
- ์ฒซ๋ฒ์งธ
public Node get(int idx) {
if (idx < 0 || idx >= size) {
throw new IndexOutOfBoundsException("Index: " + idx + ", Size: " + size);
}
if (idx == 0) {
return this.head;
} else if (idx == size - 1) {
return this.tail;
} else {
Node node = this.head;
for (int i = 0; i < idx; i++) {
node = node.next;
}
return node;
}
}
add(int idx, E e) ๋ฉ์๋
ํน์ ์ธ๋ฑ์ค์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
idx
๊ฐ 0์ธ ๊ฒฝ์ฐaddFirst
๋ฉ์๋ ํธ์ถ
idx
๊ฐ ๋ฆฌ์คํธsize
์ ๋์ผํ ๊ฒฝ์ฐaddLast
๋ฉ์๋ ํธ์ถ
idx
๊ฐ 0๋ณด๋ค ์๊ฑฐ๋size
๋ณด๋ค ํฐ ๊ฒฝ์ฐ- ์๋ฅผ ๋ค์ด, ๋ฆฌ์คํธ์ ์ ์ฒด ๋ ธ๋ ์๊ฐ 2๊ฐ ์ธ๋ฐ, ์ฝ์ ํ๋ ค๋ ์์น๊ฐ 3์ธ ๊ฒฝ์ฐ ๋ถ๊ฐํ๋ค. ๋ฐ๋ผ์ ์์ธ์ฒ๋ฆฌํ๋ค.
- ๊ทธ ์ธ
- ์ถ๊ฐํ๋ ค๋
Node
์next
๋ณ์์idx
์์น์Node
๋ฅผ ์ฐธ์กฐํ๋๋ก ๋ง๋ ๋ค. idx-1
์์น์Node
์next
๋ณ์์ ์ถ๊ฐํ๋ ค๋Node
๋ฅผ ์ฐธ์กฐํ๋๋ก ๋ง๋ ๋ค.- ๊ฒฐ๊ณผ์ ์ผ๋ก
idx
์์น์ ์กด์ฌํ๋Node
๋ ์๋กญ๊ฒ ์ถ๊ฐํNode
๊ฐ ๋๋ค.
- ์ถ๊ฐํ๋ ค๋
- ์ถ๊ฐ ํ
size
๋ฅผ 1 ์ฆ๊ฐํ๋ค.
public void add(int idx, E e) {
if (idx < 0 || idx > size) {
throw new IndexOutOfBoundsException("Index: " + idx + ", Size: " + size);
}
if (idx == 0) {
addFirst(e);
} else if (idx == size) {
addLast(e);
} else {
final Node node = new Node(e);
Node previous = get(idx - 1);
node.next = previous.next;
previous.next = node;
this.size++;
}
}
remove(int idx) ๋ฉ์๋
ํน์ ์ธ๋ฑ์ค์ ๋ ธ๋๋ฅผ ์ญ์ ํ๋ ๋ฉ์๋๋ฅผ ๊ตฌํํ ๊ฒ์ด๋ค.
idx
๊ฐ 0๋ณด๋ค ์๊ฑฐ๋size
๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์ ๊ฒฝ์ฐNode
๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์์ธ ์ฒ๋ฆฌํ๋ค.
idx
๊ฐ 0์ธ ๊ฒฝ์ฐ
head
๋ณ์์head.next
๋ณ์๋ฅผ ํ ๋นํ๋ค.
idx
๊ฐsize-1
์ธ ๊ฒฝ์ฐidx-1
์ ํด๋นํ๋Node
์ ์ ๊ทผํด์,Node.next
๋ฅผ null๋ก ํ ๋นํ๋ค.tail
๋ณ์๋ฅผidx-1
์ ์๋Node
๋ก ํ ๋นํ๋ค.
- ๊ทธ ์ธ
idx-1
์ ํด๋นํ๋Node
์ ์ ๊ทผํด์Node.next
๋ฅผNode.next.next
๋ก ํ ๋นํ๋ค.
size
๋ฅผ 1 ๊ฐ์์ํจ๋ค.
public void remove(int idx) {
if (idx < 0 || idx >= size) {
throw new IndexOutOfBoundsException("Index: " + idx + ", Size: " + size);
}
if (idx == 0) {
this.head = this.head.next;
} else {
Node node = get(idx - 1);
if (idx == size - 1) {
node.next = null;
this.tail = node;
} else {
node.next = node.next.next;
}
}
this.size--;
}