๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ
๋จ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ๊ฐ์ฅ ๋จ์ํ ํํ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ๋ ธ๋๊ฐ ๋ค์ ๋ ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ํ๋์ ์ฐธ์กฐ๋ง ๊ฐ๊ณ ์์ผ๋ฉฐ, ๋จ๋ฐฉํฅ์ผ๋ก ์ฐธ์กฐํ ์ ์๋ ํน์ง ๋๋ถ์ ๊ตฌํํ๊ธฐ ๊ฐ๋จํ๋ค.
์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๋ ธ๋ ์์ฑ
์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค์์ผ๋ ์ฝ์ ๊ณผ ์ญ์ ์ฐ์ฐ์ ๊ตฌํํด๋ณด์.
์ฝ์ ์ฐ์ฐ
์ฝ์ ์ฐ์ฐ์ ์ด ์ธ ๊ฐ์ง๋ก ํฌ๊ฒ ๊ตฌ๋ถํ ์ ์๋ค.
- Head์ ์ฝ์ ํ๊ธฐ.
- Tail์ ์ฝ์ ํ๊ธฐ.
- ํน์ ์์น์ ์ฝ์ ํ๊ธฐ.
1. Head์ ์ฝ์ ํ๊ธฐ
Head์ ์ฝ์ ํ๊ธฐ ์ ์ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
- ์๋ก์ด ๋ ธ๋ ์์ฑ
- ์๋ก์ด ๋ ธ๋์ ๋ค์ ๋ ธ๋(link ํ๋)๋ฅผ ๊ธฐ์กด์ ์๋ head๋ ธ๋๋ก ์ค์
- ํค๋ ๋ ธ๋์ ์๋ก์ด ๋ ธ๋์ ๊ตํ.
- ํ ์ผ ๋ ธ๋๋ฅผ ๊ธฐ์กด์ ํค๋๋ ธ๋๋ก ์ค์ .
2. Tail์ ์ฝ์ ํ๊ธฐ
3. ํน์ ์์น์ ์ฝ์ ํ๊ธฐ
ํน์ ์์น์ ๋
ธ๋๋ฅผ ์ฝ์
ํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ํน์ ์์น๋ฅผ ์์์ผ ํ๋ค. ๊ทธ๋์ ํน์ ์์น๋ฅผ ์ฐพ๋ ์ฝ๋๋ฅผ ๋จผ์ ๊ตฌํํด๋ณด์.
ํน์ ์์น๋ฅผ ๋ฐฉ๋ฒ
ํน์ ์์น์ ๋ ธ๋๋ฅผ ํ์ธํ๊ธฐ ์ํด์ head ๋ ธ๋์์ ๋ถํฐ ํน์ index๋งํผ ์ด๋ํ๋ค๋ฉด ํด๋น ๋ ธ๋๊ฐ ์ฐ๋ฆฌ๊ฐ ์ฐพ๊ธธ ์ํ๋ index ๋ฒ์งธ ๋ ธ๋๊ฐ ๋ ๊ฒ์ด๋ค.
ํน์ ์์น์ ์ฝ์
ํน์ ์์ง(index)๋ฅผ ์ง์ ํด์ฃผ๊ณ ํน์ ์์น์ ๋๋ฌํ๋ฉด ๊ธฐ์กด์ ์๋ Front Node์ Back Node ์ฌ์ด์ ์ฐ๊ฒฐ์ ๋์ด์ฃผ๊ณ ์๋ก์ด ๋ ธ๋๋ก ๊ฐ๊ฐ ์ฐ๊ฒฐ ์์ผ ์ค๋ค๋ฉด ๋๋ค.
์ญ์ ์ฐ์ฐ
์ญ์ ์ฐ์ฐ์๋ ์ฝ์ ์ฐ์ฐ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํฌ๊ฒ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- Head ๋ ธ๋ ์ญ์ ํ๊ธฐ
- ํน์ ์์น ๋ ธ๋ ์ญ์ ํ๊ธฐ
1. Head ๋ ธ๋ ์ญ์ ํ๊ธฐ
2. ํน์ ์์น ๋ ธ๋ ์ญ์ ํ๊ธฐ
์ ์ฒด ์์ค ์ฝ๋
public class Main {
public static void main(String[] args) {
}
}
class SimpleLinkedList {
private Node headNode; // head node
private Node tailNode; // tail node
private int size; // list's size
public SimpleLinkedList(){ // initialize list
headNode = new Node(null);
size = 0;
}
private class Node { // Node class
private Object data; // Data Field
private Node nextNode; // Link Field
Node (Object data){
this.data = data;
nextNode = null;
}
}
/*Head ์ ์ฝ์
ํ๊ธฐ.*/
void addHead(Object data){
Node newNode = new Node(data); // Make new Node
newNode.nextNode = headNode; // set newNode's Link to head
headNode = newNode; // swap headNode to newNode;
size++;
if(headNode.nextNode == null){ // check : Is headNode first
tailNode =headNode;
}
}
void addTail(Object data){
if(size == 0){ // if list is empty
addHead(data);
}else {
Node newNode = new Node(data); // Make new Node
tailNode.nextNode = newNode; // update tail's next
tailNode = newNode; // swap tailNode to newNode;
size++;
}
}
/*ํน์ ์์น์ ๋
ธ๋ ์ฐพ๊ธฐ*/
Node node(int index){
Node x = headNode;
for (int i = 0; i < index; i++) { // index ๊น์ง ๋ฐ๋ณต
x = x.nextNode; // ํ์ฌ ๋
ธ๋์ ๋ค์ ๋
ธ๋๋ฅผ ํ ๋น.
}
return x; // ํน์ index ์ ๋
ธ๋ ๋ฐํ
}
void add(Object data, int index){
if(index == 0) addHead(data);
else {
Node temp1 = node(index - 1);
Node temp2 = temp1.nextNode;
Node newNode = new Node(data);
temp1.nextNode = newNode;
newNode.nextNode = temp2;
size++;
if(newNode.nextNode == null){
tailNode = newNode;
}
}
}
/*Head ๋
ธ๋ ์ญ์ */
Object removeHead(){
Node temp = headNode; // head ์ ์๋ data ์์ ์ ์ฅ
headNode = temp.nextNode; // headNode ๋ฅผ ๊ธฐ์กด์ ๋ ๋ฒ์จฐ ๋
ธ๋๋ก ๋ฐ๊ฟ์ค๋ค.
/*๋
ธ๋ ๋ฐํ ๊ณผ์ */
Object returnData = temp.data;
temp = null;
size--;
return returnData;
}
/*Tail ํน์ ๋
ธ๋ ์ญ์ */
Object removeNode(int index){
if(index == 0) {
removeHead();
}
Node temp = node(index - 1); // ํน์ ์์น ์ ์ ๋
ธ๋ ์ฐพ๊ธฐ
Node targetNode = temp.nextNode; // temp ๋
ธ๋์ ๋ค์ ๋
ธ๋๊ฐ ์ญ์ ๋ ๋
ธ๋
temp.nextNode = temp.nextNode.nextNode; // temp ๋
ธ๋๋ ์ญ์ ๋ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํด
/*๋
ธ๋ ๋ฐํ ๊ณผ์ /
Object returnData = targetNode.data;a
if(targetNode == tailNode){
tailNode = temp;
}
targetNode = null;
size--;
return returnData;
}
}
๋๊ธ