๋ชฉ์ฐจ
์ฐ๊ฒฐ๋ฆฌ์คํธ์ ์ถ๊ฐ, ์ญ์ ์๋ฆฌ๋ ์ ๋ง ๊ฐ๋จํ๋ฐ ๊ทธ ์ถ์์ ์ธ ๊ฐ๋ ์ ๋จธ๋ฆฟ์์ผ๋ก ๊ทธ๋ฆฌ๋๊ฒ ๋๋ฌด ์ค๋ ๊ฑธ๋ ธ๋ค.
source code
package collection.link;
public class MyLinkedListV2 {
private Node first;
private int size = 0;
//๋ง์ง๋ง ์ธ๋ฑ์ค์ ๊ฐ์ ์ถ๊ฐ
public void add(Object e) {
Node newNode = new Node(e);
if(first == null) {
first = newNode;
} else {
getLastNode().next = newNode;
}
size++;
}
//์ถ๊ฐ ์ฝ๋
public void add(int index, Object e) {
Node newNode = new Node(e);
//์ ์ผ ์ฒ์
if(index ==0) {
newNode.next = first;
first = newNode;
} else {
/*
๋ด ์ง์ ๋
ธ๋(index -1)๋ฅผ ๊ตฌํ ๋ค ์ง์ ๋
ธ๋์ next๊ฐ์ ์ ๊ท ๋
ธ๋์ next๊ฐ์ผ๋ก ๋ฃ๊ณ
์ง์ ๋
ธ๋์ next๊ฐ ์ ๊ท ๋
ธ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝํ๋ค.
ex1)
์ ๊ท๋ก ๋ง๋ ๋
ธ๋์ ์ฃผ์๊ฐ์ x04๋ค.
์ง์ ๋
ธ๋์ next๋ x03 ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์์๋ค.
์ ๊ท๋ก ๋ง๋ ๋
ธ๋์ next๊ฐ x03์ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝํ๋ค.(newNode.next = prev.next)
์ง์ ๋
ธ๋์ next๋ ์ ๊ท ๋
ธ๋์ฃผ์๊ฐ์ธ x04๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ๋ณ๊ฒฝํ๋ค.(prev.next = newNode)
ex2)
0๋ฒ ์งธ ๋
ธ๋:๋๋ฆฌ,
1๋ฒ ์งธ ๋
ธ๋: ๋์น,
2๋ฒ ์งธ ๋
ธ๋: ๋์ฐ๋
๋๋ฆฌ์ next๋ ๋์น๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋์น์ next๋ ๋์ฐ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ๋์ฐ๋๋ฅผ null์ ๊ฐ๋ฆฌํจ๋ค.
์ด ๋ 2๋ฒ ์งธ ๋
ธ๋(ํ์ฌ ๋์ฐ๋ ์์น)์ ํฌ๋์ด๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํ๋ค.
ํฌ๋์ด๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋จผ์ ์ง์ ๋
ธ๋์ธ ๋์น๋ฅผ ์์์ผ ํ๋ค.
๋์น์ next๋ ๋์ฐ๋๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ค.
์ด์ ๋์น์ next์ฃผ์(๋์ฐ๋)๋ฅผ ์ ๊ท ๋
ธ๋์ธ ํฌ๋์ด์ next์ ๋ฃ์ด์ ํฌ๋์ด๊ฐ ๋์ฐ๋๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค.
๊ทธ ๋ค์ ๋์น์ next๋ ํฌ๋์ด๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ฉด ๋๋ค.
*/
Node prev = getNode(index - 1);
newNode.next = prev.next;
//์ง์ ๋
ธ๋์ next๊ฐ์ ์ ๊ท ๋
ธ๋๋ก ๋ฐ๊ฟ์ค๋ค.
prev.next = newNode;
}
size++;
}
private Node getLastNode() {
Node x = first;
while (x.next != null) {
x = x.next;
}
return x;
}
public Object set(int index, Object e) {
Node x = getNode(index);
Object oldValue = x.item;
x.item = e;
return oldValue;
}
//์ถ๊ฐ ์ฝ๋
public Object remove(int index) {
Node removeNode = getNode(index);
Object removedItem = removeNode.item;
//์ฒซ๋ฒ ์งธ๊ฐ ๊ฐ๋ฆฌํค๋๊ฒ ๋ด๊ฐ ๊ฐ๋ฆฌํค๋๊ฑธ๋ก ๋ณ๊ฒฝ
if(index == 0) {
first = removeNode.next;
//๋ด ์ง์ ๋
ธ๋๊ฐ ๋ด๊ฐ ๊ฐ๋ฆฌํค๋๊ฑธ๋ก ๋ณ๊ฒฝ
} else {
Node prev = getNode(index - 1);
prev.next = removeNode.next;
}
//๋ด ์์ดํ
null๋ก, ๋ด๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๋ null๋ก
removeNode.item = null;
removeNode.next = null;
size--;
return removedItem;
}
public Object get(int index) {
return getNode(index).item;
}
private Node getNode(int index) {
Node x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
}
public int indexOf(Object e) {
int index = 0;
for (Node x = first; x != null; x = x.next) {
if(e.equals(x.item)) {
return index;
}
index++;
}
return -1;
}
public int size() {
return size;
}
@Override
public String toString() {
return "MyLinkedListV1{" +
"first=" + first +
", size=" + size +
'}';
}
}
๋ง์ง๋ง ์ธ๋ฑ์ค์ ๊ฐ์ ์ถ๊ฐํ๋ ๊ฑด ์ฌ์ ๋๋ฐ ํน์ ์ธ๋ฑ์ค์ ๊ฐ์ ๋ฃ๋ ๊ฑธ ์ดํดํ๋๋ฐ ํ์ฐธ ๊ฑธ๋ ธ๋ค.
๊ทธ๋์ ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๋ฉด์ ์ฃผ์์ผ๋ก ์ ๋ฆฌํ๋ฉฐ ๊ฒจ์ฐ ์ดํด ํ๋ค.
๊ทธ๋์ add(int index, Object e) ๋ถ๋ถ์ ์ฃผ์์ด ๊ธธ๋ค.
์ ๋ฉ์๋๋ฅผ ์ดํดํ๋ remove๋ ํ๊ฒฐ ์ฌ์์ ์ฃผ์์ ๋ฌ์ง ์์๋ค.
์๋๋ ์ ๋ค๋ฆญ ํ์ ๊ณผ ์ค์ฒฉ ํด๋์ค๋ฅผ ๋์ ํ ๋ฆฌํฉํ ๋ง ์ฝ๋๋ค.
Refactoring code
package collection.link;
// ์ ๋ค๋ฆญ ํ์
์ผ๋ก ์์
public class MyLinkedListV3<E> {
private Node<E> first;
private int size = 0;
//๋ง์ง๋ง ์ธ๋ฑ์ค์ ๊ฐ์ ์ถ๊ฐ
public void add(E e) {
Node<E> newNode = new Node<>(e);
if(first == null) {
first = newNode;
} else {
Node<E> lastNode = getLastNode();
lastNode.next = newNode;
}
size++;
}
//์ถ๊ฐ ์ฝ๋
public void add(int index, E e) {
Node<E> newNode = new Node<>(e);
//์ ์ผ ์ฒ์
if(index ==0) {
newNode.next = first;
first = newNode;
} else {
Node<E> prev = getNode(index - 1);
newNode.next = prev.next;
//์ง์ ๋
ธ๋์ next๊ฐ์ ์ ๊ท ๋
ธ๋๋ก ๋ฐ๊ฟ์ค๋ค.
prev.next = newNode;
}
size++;
}
private Node<E> getLastNode() {
Node<E> x = first;
while (x.next != null) {
x = x.next;
}
return x;
}
public E set(int index, E e) {
Node<E> x = getNode(index);
E oldValue = x.item;
x.item = e;
return oldValue;
}
//์ถ๊ฐ ์ฝ๋
public E remove(int index) {
Node<E> removeNode = getNode(index);
E removedItem = removeNode.item;
//์ฒซ๋ฒ ์งธ๊ฐ ๊ฐ๋ฆฌํค๋๊ฒ ๋ด๊ฐ ๊ฐ๋ฆฌํค๋๊ฑธ๋ก ๋ณ๊ฒฝ
if(index == 0) {
first = removeNode.next;
//๋ด ์ง์ ๋
ธ๋๊ฐ ๋ด๊ฐ ๊ฐ๋ฆฌํค๋๊ฑธ๋ก ๋ณ๊ฒฝ
} else {
Node<E> prev = getNode(index - 1);
prev.next = removeNode.next;
}
//๋ด ์์ดํ
null๋ก, ๋ด๊ฐ ๊ฐ๋ฆฌํค๋ ์ฃผ์๋ null๋ก
removeNode.item = null;
removeNode.next = null;
size--;
return removedItem;
}
public E get(int index) {
Node<E> node = getNode(index);
return node.item;
}
private Node<E> getNode(int index) {
Node<E> x = first;
for (int i = 0; i < index; i++) {
x = x.next;
}
return x;
}
public int indexOf(E e) {
int index = 0;
for (Node<E> x = first; x != null; x = x.next) {
if(e.equals(x.item)) {
return index;
}
index++;
}
return -1;
}
public int size() {
return size;
}
@Override
public String toString() {
return "MyLinkedListV1{" +
"first=" + first +
", size=" + size +
'}';
}
//์ค์ฒฉ ํด๋์ค
private static class Node<E> {
E item;
Node<E> next;
public Node(E item) {
this.item = item;
}
//[A -> B -> C]
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Node<E> x = this;
sb.append("[");
while (x != null) {
sb.append(x.item);
if(x.next != null) sb.append("->");
x = x.next;
}
sb.append("]");
return sb.toString();
}
}
}
๊น์ํ์ ์ค์ ์๋ฐ - ์ค๊ธ 2ํธ ๊ฐ์ | ๊น์ํ - ์ธํ๋ฐ
๊น์ํ | ์๋ฐ ์ ๋ค๋ฆญ๊ณผ ์ปฌ๋ ์ ํ๋ ์์ํฌ๋ฅผ ์ค๋ฌด ์ค์ฌ์ผ๋ก ๊น์ด์๊ฒ ํ์ตํฉ๋๋ค. ์๋ฃ ๊ตฌ์กฐ์ ๋ํ ๊ธฐ๋ณธ๊ธฐ๋ ํจ๊ป ํ์ตํฉ๋๋ค., ๊ตญ๋ด ๊ฐ๋ฐ ๋ถ์ผ ๋์ ์๊ฐ์ 1์, ์ ๋๋ก ๋ง๋ ๊น์ํ์ ์ค์
www.inflearn.com
๊ฐ์ธ ์คํฐ๋ ๊ธฐ๋ก์ ๋ฉ๋ชจํ๋ ๊ณต๊ฐ์ด๋ผ ํ๋ฆฐ์ ์ด ์์ ์ ์์ต๋๋ค.
ํ๋ฆฐ ์ ์์ ๊ฒฝ์ฐ ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค.
๋๊ธ