๋งํฌ๋ ๋ฆฌ์คํธ๋ ์ฐ์์ ์ด์ง ์์ ๊ณต๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
๋
ธ๋ ๋จ์๋ก ์ ์ฅ์ด ๋๋ฉฐ ์ด ๋
ธ๋์๋ ๋ฐ์ดํฐ์ ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฅดํค๋ ์ฐธ์กฐ์๊ฐ ์กด์ฌํ๋ค.
์ฐธ์กฐ์๋ฅผ ํตํด ๊ฐ ๋
ธ๋๋ผ๋ฆฌ ์ฐ๊ฒฐ๋๋ค.
์ฒซ ๋
ธ๋์ ์์น๋ฅผ ์๊ธฐ์ํด Header๊ฐ ์กด์ฌํ๋ฉฐ ์์คํ
์ ๋ฐ๋ผ
๋ง์ง๋ง ๋
ธ๋๋ฅผ ์๊ธฐ์ํด Tail์ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
<์ฅ์ >
๋ฐฐ์ด๊ณผ ๋ค๋ฅด๊ฒ ๊ธธ์ด์ ์ ํ์ด ์๋ค.
์๋ก์ด ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ฌ์ ๋
ธ๋์ ์ฐ๊ฒฐ์ ๋๊ณ ๋ค์ ์ด์ด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ํ ๋ฐฐ์ด ์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๋ฐ๊ฑฐ๋ ๋น๊ธธ ํ์ ์์ด
๋ฐ๋ก ์ญ์ ์ ์ถ๊ฐ๊ฐ ๊ฐ๋ฅํ๋ค.
<๋จ์ >
์ธ๋ฑ์ค๋ฅผ ํตํ ์กฐํ๊ฐ ๋ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ์ํ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฐ๋ค.
Linked List๋ List ๊ฐ์ฒด๋ฅผ ์์๋ฐ์ ๋ง๋ค์ด์ง๋ค.
๋ฐ๋ผ์ ArrayList์ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ๋น์ทํ๋ฉฐ
๊ตฌํ๋ํ ๋์ผํ๊ฒ ํ ๊ณํ์ด๋ค.
ํฌ์ธํฐ๊ฐ ์์ด ์ ๊ฑธ ์ด๋ป๊ฒ ๊ตฌํํด์ผํ๋ ์ถ์ง๋ง ์ฌ์ค ๋ฐฉ๋ฒ์ด ์๋ค.
์ฐธ์กฐ ์๋ฃํ์ Heap์์ญ์ ๋์ ํ ๋น๋๋ฉฐ ๋์ ํ ๋น ๋ ์์ญ์ ์์์ฃผ์๊ฐ
์คํ์ ์ ์ฅ๋๋ ๋ฐฉ์์ด๋ค.
์ฆ, C์์ ๋์ ํ ๋น์ ํ๋ ๊ฒ์ด๋ ๊ฐ์ ๋ฐฉ์์ด๋ค.
์ฐ๋ฆฌ๊ฐ String str=new String("์ด์ฉํฐ๋น");
๋ฅผ ํ๊ฒ๋๋ฉด Heap์์ญ์ ์ด์ฉํฐ๋น ๋ผ๋ ๋ฌธ์์ด ์์๊ฐ ์ ์ฅ๋๊ณ
์ด ์์์ ์์์ฃผ์๋ฅผ str์ ๋ณต์ฌํ์ฌ ์ ์ฅํ๋ค.
ํด๋์ค์ ๊ฒฝ์ฐ์๋
Stack (main method) Heap
---------------------- ------------------------
| myObject (0x1a2b) | -----> | MyClass (0x1a2b) |
| | | intValue: 10 |
| | | doubleValue: 20.5 |
| | | stringValue: "Hello" |
---------------------- ------------------------
์ ๊ทธ๋ฆผ์ฒ๋ผ ์คํ์๋ ํด๋์ค์ ์ฃผ์๊ฐ ๊ทธ ๋ด๋ถ์๋ ๋ค์ํ ๋ฉค๋ฒ๋ณ์,๋งค์๋ ๋ฑ์ด ์กด์ฌํ๋ค.
์ฐธ์กฐ์๋ฃํ์ ์ธ๋ป ๋ณด๋ฉด Call by Reference ๋ฐฉ์์ธ ๊ฒ ๊ฐ์ผ๋ ์ค์์ ๊ทธ๋ ์ง ์๋ค.
public class Member {
public String name;
}
public void change(Member m) {
m.name = "๊น๋ฏผ์";
}
๋ผ๋ ๋ฉ์๋๋ Member ํด๋์ค๋ฅผ ๋ฐ์ ํด๋น ํด๋์ค์ ์ด๋ฆ์ ๋ณ๊ฒฝํด์ค๋ค.
Main์์ ์คํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ์ด๋ฆ๊ฐ์ด ๋ฐ๋์ ์ ์ ์๋ค.
public static void main(String[] args) {
Member member = new Member();
member.name = "์ด์ํฌ";
change(member);
System.out.println(member.name); // ์ถ๋ ฅ ๊ฒฐ๊ณผ: "๊น๋ฏผ์"
}
์ด๊ฑธ ๋ณด๊ณ ์๋ฐ๋ Call by Reference๋ฅผ ์ง์ํ๋๊ตฌ๋! ์ถ์ง๋ง ์ค์์ ๊ทธ๋ ์ง ์๋ค.
์์์ ๋งํ๋ฏ์ด ์๋ฐ์ ์ฐธ์กฐ์๋ฃํ์ ํ์ ์ ์ฅ๋๋ฉฐ ๊ทธ ์ฃผ์๋ง ์คํ์ ์ ์ฅ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ์ฐธ์กฐ์๋ฃํ์ ๋๊ฒจ์ค ๋ ์ฌ์ค์ ์ด ์คํ์ ์ ์ฅ๋ ์ฃผ์๊ฐ์ด ๋ณต์ฌ๋์ด ๋์ด๊ฐ๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ด ์ฃผ์๊ฐ์ ํด๋นํ๋ ํด๋์ค ๋ด๋ถ์ name์ ๋ณ๊ฒฝํ๋ผ๋ ๋ช
๋ น์ด๊ธฐ์ ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ๋ฉ์๋๊ฐ
public void change(Member m) {
m = new Member();
m.name = "๊น๋ฏผ์";
}
์ด๋ฐ ์์ผ๋ก ์๋ก์ด Member ํด๋์ค๋ก ๊ฐ์๋ผ์ฐ๋ ค ํ๋ค๋ฉด ๋ณํํ์ง ์์ ๊ฒ์ด๋ค.
Stack Heap
----------------- ---------------------
| member (0x1a2b) | ---> | Member object |
----------------- | name: "์ด์ํฌ" |
---------------------
Stack (change method) Stack (main method) Heap
---------------------- ----------------- ---------------------
| m (0x1a2b) | ---> | member (0x1a2b) | ---> | Member object |
---------------------- ----------------- | name: "์ด์ํฌ" |
---------------------
m.name = "๊น๋ฏผ์" ์ํ ํ
Stack Heap
----------------- ---------------------
| member (0x1a2b) | ---> | Member object |
----------------- | name: "๊น๋ฏผ์" |
---------------------
java์์ ์ฌ์ฉํ๋๊ฑฐ ์ฒ๋ผ ์๋ฐฉํฅ LinkedList๋ฅผ ๊ตฌํํด๋ณด์.
private class Node{
//1. ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ ๊ฐ๋ฅํด์ผํจ
//2. ๋ค์ ๋
ธ๋๋ฅผ ๊ฐ๋ฅด์ผ์ผํจ ๋จ ํฌ์ธํฐ๋ ์์;; ๋๊ฒ ๋ถํธํ๋ค
private Object data;
private Node nextNode;//๋จ๋ค์ ์ฐธ์กฐ ๋ถ๊ฐ
private Node prevNode;
public Node(){
this.data=null;
this.nextNode=null;
this.prevNode=null;
}//๋
ธ๋ ์์ฑ์ ์ด๊ธฐํ
public Node(Object input){
this.data=input;
this.nextNode=null;
this.prevNode=null;
}//๊ฐ ์
๋ ฅ์ ๊ฐ ๋ฐ์ํ์ฌ ์ด๊ธฐํ
@Override
public String toString(){
return String.valueOf(this.data);
}
}
LinkedList ํด๋์ค ์ ์ธ์ ์๋์ผ๋ก
Head์ Tail์ด ์๋ก๋ฅผ ๊ฐ๋ฅดํค๊ฒ ํด์ผํจ.
public class customLinkedList {
private Node Head;
private Node Tail;
customLinkedList(){
Head=new Node();
Tail=new Node();
Head.nextNode=Tail;
Tail.prevNode=Head;
}
}//์ด๋ฅผ ์ํด ์์ฑ์์ ํด๋์ค ์์ฑ์ ์๋์ผ๋ก Node๋ฅผ ํ ๋น๋ฐ์ ์๋ก ์ฐ๊ฒฐํ๊ฒ ํด์ค
1. ์ด๊ธฐ์ํ์์ ์ฝ์
์
์์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๋๊ณ ์์๊ฒ์ด๋ค.
์ด๋ ์๋ก์ด ๋
ธ๋๋ฅผ ์ถ๊ฐํ๋ค๊ณ ํด๋ณด์.
์ด ๊ตฌ์กฐ์์ ์๋ก์ด ๋
ธ๋๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด์๋
Head.nextNode๋ฅผ newNode์ ์ฐ๊ฒฐํ๊ณ
Tail.prevNode๋ฅผ newNode์ ์ฐ๊ฒฐํด์ผ ํ ๊ฒ์ด๋ค.
์ฆ ๋ค์๊ณผ ๊ฐ์ ์ฐ๊ฒฐ์ ๋๊ณ ์๋ก ์ฝ์
์ ํด์ผํ๋ค.
์ฌ๊ธฐ์ ๋ ํ์ฅ์ ํด๋ณด์.
์ด๊ธฐ ์ํ์์ ์ข๋ ์งํ๋ฌ์ ๊ฒฝ์ฐ๋ผ๊ณ ํด๋ณด์.
๋ง์ฝ ์ด๋ฐ์์ด๋ผ๋ฉด? Tail์ ์ ~~ ๋ค์ ์กด์ฌํ๋ค๋ฉด?
์ด๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ Head๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋ง์ฐฌ๊ฐ์ง ์ผ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ Head์ Tail๋ง์ ์ฌ์ฉํด์ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ด์ด์ผ ํ๋ค.
์ด๊ธฐ ์ํ์์ Head.nextNode == anotherNode๋ฅผ
anotherNode.prevNode=Head๋ฅผ ๊ฐ๋ฅดํค๊ณ ์๋ค.
๋ง์ฝ Head.nextNode=newNode๋ฅผ ๋จผ์ ์ฐ๊ฒฐ์์ผ๋ฒ๋ฆฐ๋ค๋ฉด
anotherNode์ ๋ํ ์ ๋ณด๋ฅผ ์ ์คํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ anotherNode๋ฅผ Head๋ฅผ ํตํด ๋จผ์ newNode์ ์ฐ๊ฒฐํด์ผํ๋ค.
๊ทธ ๋ค์ Head์ newNode๋ฅผ ์ฐ๊ฒฐํ๋ค.
๋ฐ๋์ ๊ฒฝ์ฐ๋ ๋๊ฐ์ ์๋ฆฌ๋ก anotherNode๋ถํฐ ์ฐ๊ฒฐํ Tail์ ์ฐ๊ฒฐํด์ผ ํ๋ค.
์ด๋ฅผ ์ฝ๋๋ก ์ฐ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
public void addFirst(Object obj){
Node newNode=new Node(obj);
Head.nextNode.prevNode=newNode;
newNode.nextNode=Head.nextNode;//another Node๋ถํฐ ์ฐ๊ฒฐ
Head.nextNode=newNode;
newNode.prevNode=Head;
size++;
}
public void addLast(Object obj){
Node newNode=new Node(obj);
Tail.prevNode.nextNode=newNode;
newNode.prevNode=Tail.prevNode;//another Node๋ถํฐ ์ฐ๊ฒฐ
Tail.prevNode=newNode;
newNode.nextNode=Tail;
size++;
}
public static void main(String[] args) {
customLinkedList cLinkedList=new customLinkedList();
cLinkedList.addFirst(1);
cLinkedList.addFirst(2);
cLinkedList.addFirst(3);
cLinkedList.addFirst(4);
cLinkedList.addFirst(5);
cLinkedList.addLast(1);
cLinkedList.addLast(2);
cLinkedList.addLast(3);
cLinkedList.addLast(4);
cLinkedList.addLast(5);
cLinkedList.printAll();
}
public void printAll(){
int i=0;
for(Node tmp=Head.nextNode;tmp.nextNode!=null;tmp=tmp.nextNode,i++)
System.out.println(i+"๋ฒ์งธ ๋ฐ์ดํฐ"+tmp.data);
}
๋ค์๊ณผ ๊ฐ์ด ๋
ธ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ถ๋ ฅ์ ์ฌ์ง๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ด์ ํ์ธํ ์์๋ค.
์ํ๋ ์์น์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ add๋ฅผ ๊ตฌํํด๋ณด์.
์ด๋ฅผ ์ํด ์ํ๋ ์ธ๋ฑ์ค์ ํด๋นํ๋ ๋
ธ๋๋ฅผ ์ฐพ๋ node ๋งค์๋๋ฅผ ๊ตฌํํ๋ค.
private Node node(int index){
if(index>size)
return null;
Node tmp=Head;
for(int i=0;i<=index;i++)
tmp=tmp.nextNode;
return tmp;
}//i๋ฒ์งธ ๋
ธ๋ ๋ฐํํ๊ธฐ
์ด๋ฅผ ํ์ฉํ์ฌ add๊ตฌํํ๋ค.
์์์๋ index์ ํด๋นํ๋ ๋
ธ๋๋ฅผ ๋ฐํํ๋ค.
๋ง์ฝ add์์ 2๋ฒ์งธ ์ธ๋ฑ์ค์ 3์ ์ ์ฅํ๊ณ ์ถ๋ค๊ณ ํ๋ค๋ฉด
ํ์ฌ 2๋ฒ ์์น์ ๋
ธ๋๋ ๋ฐ๋ ค์ 3๋ฒ์ด ๋๊ณ newNode๊ฐ 2๋ฒ์ด ๋์ด์ผํ๋ค.
์ฆ, ์์์ 2๋ฒ์ ์ฐพ์ํ Tail์ ์ฐ๊ฒฐ์ํค๋ฏ์ด ๋๊ฐ์ด ํ๋ฉด ๋๋ค.
public static void main(String[] args) {
customLinkedList cLinkedList=new customLinkedList();
cLinkedList.addFirst(1);
cLinkedList.addFirst(2);
cLinkedList.addFirst(3);
cLinkedList.addFirst(4);
cLinkedList.addFirst(5);
cLinkedList.addLast(1);
cLinkedList.addLast(2);
cLinkedList.addLast(3);
cLinkedList.addLast(4);
cLinkedList.addLast(5);
cLinkedList.printAll();
cLinkedList.add(3,"์ด์ฉํฐ๋น");
cLinkedList.printAll();
}
public void add(int index,Object obj){
Node base=node(index);
Node newNode=new Node(obj);
base.prevNode.nextNode=newNode;
newNode.prevNode=base.prevNode;//another Node๋ถํฐ ์ฐ๊ฒฐ
base.prevNode=newNode;
newNode.nextNode=base;
}
https://github.com/Rachi3/dataStructure/tree/master/3.LinkedList
๋จ์ ๋ถ๋ถ ๊ตฌํ๋ ๋งํฌ๋ค.