์ฐ๊ฒฐ ๋ฆฌ์คํธ Linked List
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ ๋ค๋์ ๊ณตํต(์ ํ) ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํด์ Array, ์ฆ ๋ฐฐ์ด์ ๋ง์ด ์จ์๋ค. ๋ฐฐ์ด์ ๊ตฌํ์ด๋ ๊ฒ๋ ์์ด ๊ฐ๋จํ๊ณ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ง๋ง ์น๋ช ์ ์ธ ๋จ์ ์ด ์๋ค.
๋ฐ๋ก ์ฐ์์ ์ธ ๋ฐ์ดํฐ ์ ์ฅ์ด๋ค.
๋ฐฐ์ด์ data์ element ๋ค์ด ๋ฉ๋ชจ๋ฆฌ์ ์ธ์ ํ ์์น์ ์ ์ฅ๋๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ด์ด ์ ์ฅ๋๋ค.
์ด๋ฌํ ์ ์ด ๋ฐฐ์ด์ ์์ฑํ๊ณ ์ญ์ , ์ฝ์ ํ๋ ๊ณผ์ ์์ ํฐ ์ค๋ฒํค๋๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๋ LinkedList๋ฅผ ๋ฐฐ์์ผ ํ๋ ์ด์ ์ด๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ทธ๋ฆผ์์๋ ๋ณด์ด๋ฏ์ด ๋น์ฐ์์ ์์น์ ๊ฐ๊ฐ์ ๋ฐ์ดํฐ๋ค์ด ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ฒฐํ๊ณ ์๋ค.
Node
์ฐ๊ฒฐ ๋ฆฌ์คํธ์๋ ๋ ธ๋๋ผ๋ ๊ฐ๋ ์ด ์๋ค. ์ด ๋ ธ๋์ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ๋ค์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ์ ์๊ฒ ํ๋ ์ฃผ์ ์ฐธ์กฐ๋ฅผ ํ์ธํ ์ ์๋ค.
๋ ธ๋์ ๊ตฌ์กฐ
๋ ธ๋๋ ๋ ๊ฐ์ง์ ํ๋๋ก ๊ตฌ์ฑ๋๋ค.
- Data Field
- Link Field
Data Field
๋ฐ์ดํฐ ํ๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ณณ์ ์ค์ ๊ฐ Actual Value์ด ์ ์ฅ๋๋ ๋ถ๋ถ์ด๋ค.
Link Field
๋งํฌ ํ๋๋ผ๊ณ ๋ถ๋ฆฌ๋ ๊ณณ์ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์์น(์ฃผ์)Address ํฌ์ธํฐ์ด๋ค.
์ด๋ฌํ ๋ ธ๋์ ๊ตฌ์กฐ ๋๋ถ์ ์ฐ๋ฆฌ๋ ์ ํ ๋ฐ์ดํฐ๋ฅผ Array์ฒ๋ผ ์ฐ์๋๋ ๊ณต๊ฐ์ ์ ์ฅํ์ง ์์๋ ๋๊ณ , ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋จ์ด์ง ๊ณณ์ ์ ์ฅํ ์ ์๊ฒ๋๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ตฌ์กฐ
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ด 3 ๊ฐ์ง์ ํฐ ํํธ๊ฐ ์กด์ฌํ๋ค.
- Head Node
- Body Node
- Tail Node
1. Head Node
ํค๋ ํฌ์ธํฐ๋ผ๊ณ ๋ ๋ถ๋ฆฌ๋ ์ด ๋ถ๋ถ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์์ ์ง์ ์ ๋ปํ๋ค.
2. Body Node
ํค๋ ํฌ์ธํฐ์ ์ํด ์ ๊ทผ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ๋ด๊ณ ์๋ ๋ถ๋ถ์ด๋ค.
3. Tail Node
Tail ๋ ธ๋๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ง์ง๋ง ๋ถ๋ถ์ ๋ปํ๊ณ ํต์์ ์ผ๋ก Null์ ๊ฐ๋ฆฌํค๊ณ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ๊ฐ ๋ง์ง๋ง์ด๋ผ๋ ๊ฒ์ ์๋ ค์ค๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์ฐ์ฐ
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ์๋ ๊ธฐ๋ณธ์ ์ฐ์ฐ์ ์ฝ์ ์ฐ์ฐ๊ณผ ์ญ์ ์ฐ์ฐ์ด๋ค.
1. ์ฝ์ ์ฐ์ฐ
์ฝ์ ์ฐ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ ธ๋ ์์ฑ
- ์ฝ์ ํ ์์น ์ง์
- ์ฝ์ ํ ์์น์ ์ ๋ ธ๋์ ๋งํฌ ํ๋๋ฅผ ์ฝ์ ํ ๋ ธ๋์ ์ฃผ์๋ก ์ค์
- ์ฝ์ ํ ๋ ธ๋์ ๋งํฌ ํ๋๋ฅผ ์ฝ์ ํ๊ธฐ ์ ์์น์ ์๋ ๋ง์ง๋ง ๋ ธ๋๋ก ์ค์
- ์ฝ์
2. ์ญ์ ์ฐ์ฐ
์ญ์ ์ฐ์ฐ์ ์์๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์ญ์ ํ ๋ ธ๋ ์ง์
- ์ญ์ ํ ์์น์ ์ ๋ ธ๋์ ๋งํฌ ํ๋๋ฅผ ์ญ์ ํ ๋ ธ๋์ ๋ค์ ๋ ธ๋์ ๋งํฌ ํ๋๋ก ์ง์
- ์ญ์
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ 3 ๊ฐ์ง ์ข ๋ฅ
- ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
- ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
1. ๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ์์์ ์ค๋ช ํ๋ ์ผ๋ฐ์ ์ธ ๋ฆฌ์คํธ์ด๋ค. Head ํฌ์ธํฐ๋ก ์์ํ์ฌ Tail ํฌ์ธํฐ๊ฐ Null์ ๊ฐ๋ฆฌํค๊ณ ์๋ ์ผ๋ฐ์ ์ธ ๋ชจ์ต์ ์ฐ๊ฒฐ๋ฆฌ์คํธ ์ด๋ค.
2. ์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ํ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ Tail ๋ ธ๋๊ฐ Head ๋ ธ๋๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ ํํ์ด๋ค.
3. ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ
์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๋ ธ๋์ ๋ค์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ Link Field ๋ฅผ ๋ ๊ฐ๋ฅผ ๋ง๋ค์ด์ ์ ์ ๋ ธ๋์ ๋ค์ ๋ ธ๋๋ฅผ ํ ๋ฒ์ ๊ฐ๋ฆฌํค๋ ๋ชจ์ต์ด๋ค.
๊ตฌํ
public class Main {
public static void main(String[] args) {
LinkedList list = new LinkedList();
list.add(11);
list.add(33);
list.add(1, 22);
list.print();
list.remove();
list.print();
System.out.println(list.get(0) + " ");
}
}
class MyNode {
private int data; // ์ค์ ๊ฐ, actual value
private MyNode nextNode; // ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์์น(์ฃผ์) ํฌ์ธํฐ
MyNode(int data) {
this.data = data;
this.nextNode = null;
}
void setNextNode(MyNode nextNode) {
this.nextNode = nextNode;
}
MyNode getNextNode() {
return nextNode;
}
int getData() {
return data;
}
}
class LinkedList {
private MyNode headNode;
LinkedList() {
headNode = null;
}
// ๋ง์ง๋ง์ ๋
ธ๋ ์ถ๊ฐ
void add(int data) {
MyNode newNode = new MyNode(data);
if(headNode == null) { // head ํฌ์ธํฐ๊ฐ ์์ ๋, ์ฐ๊ฒฐ ๋ฆฌ์คํธ๊ฐ ๋น์ด์์ ๋
this.headNode = newNode;
}else { // head ํฌ์ธํฐ๊ฐ ์กด์ฌํ ๋, ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ๊ฐ ์์ ๋
MyNode pointerNode = headNode;
while(pointerNode.getNextNode() != null) {
pointerNode = pointerNode.getNextNode();
}
pointerNode.setNextNode(newNode);
}
}
// ํน์ ์ธ๋ฑ์ค์ ๋
ธ๋ ์ถ๊ฐ
void add(int index, int data) {
MyNode newNode = new MyNode(data);
if(headNode == null) {
headNode = newNode;
}else {
MyNode pointerNode = headNode;
while(index > 1) {
pointerNode = pointerNode.getNextNode();
}
// ์ธ๋ฑ์ค๊ฐ ๋ง์ง๋ง ๋
ธ๋์ผ ๊ฒฝ์ฐ
if(pointerNode.getNextNode() == null) {
pointerNode.setNextNode(newNode);
}else {
// ์๋ก์ด ๋
ธ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๋
ธ๋๋ ์ด์ ์ ์ฐ๊ฒฐ๋ ๋
ธ๋
MyNode preNode = pointerNode;
newNode.setNextNode(preNode.getNextNode());
}
pointerNode.setNextNode(newNode);
}
}
void remove() {
MyNode pointerNode = headNode;
MyNode previousNode = pointerNode;
if(headNode == null) {
return;
}
if(headNode.getNextNode() == null) {
headNode = null;
} else {
while(pointerNode.getNextNode() != null) {
previousNode = pointerNode;
pointerNode = pointerNode.getNextNode();
}
previousNode.setNextNode(null);
}
}
int get(int index) {
MyNode pointerNode = this.headNode;
if(headNode == null) {
return -1;
}else {
while(index-- > 0) {
pointerNode = pointerNode.getNextNode();
}
return pointerNode.getData();
}
}
void print() {
MyNode pointerNode = this.headNode;
int index = 0;
while(pointerNode != null) {
System.out.println("index: " + index + " data: " + pointerNode.getData());
pointerNode = pointerNode.getNextNode();
index++;
}
}
}
๋๊ธ