โจ Constructor & Basic Attribute
private Node head;
private Node tail;
private int size;
private class Node{
private int value;
private Node next;
private Node(int data) {
this.value = data;
this.next = null;
}
public String toString() {
return String.valueOf(this.value);
}
}
์ ์ผ ์์ ์๋ ๋ ธ๋, ๋ค์ ์๋ ๋ ธ๋, size๋ฅผ ์ ์ํ๋ค. ๋ํ ๋ ธ๋๋ฅผ ๋ด๋ถ class๋ก ์์ฑํ์ฌ contructor๋ก ๊ฐ์ฒด ์์ฑ ์ ์ด๊ธฐํํ ์ ์๋๋ก ํ๋ค.
โจ addFirst(int data)
public void addFirst(int data) {
Node newNode = new Node(data);
// ๊ธฐ์กด์ head๋ฅผ ๋ค์ node๋ก ์ง์
newNode.next = head;
head = newNode;
size++;
if(head.next == null) {
tail = head;
}
}
์ฝ๋๋ฅผ ๊ณต๋ถํ๋๋ฐ ์๋ฒฝํ๊ฒ ์ดํด๊ฐ ๊ฐ์ง ์์์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค ์ดํด๋ฅผ ํ๋ ค๊ณ ๋ ธ๋ ฅํ๋ค.
addFirst๋ฅผ ํ๊ธฐ ์ ์๋ ์ฒซ ๋ฒ์งธ ํ๋์ ๋๊ทธ๋ผ๋ฏธ๊ฐ Head ์๋ค. newNode๊ฐ head๊ฐ ๋๊ธฐ ์ด์ ์, newNode์ next์ head์ ์ ๋ณด๋ฅผ ๋๊ณ newNode๋ฅผ head๋ก ์ง์ ํ๋ค. ์ด๋, head = newNode๋ฅผ ์งํํ๊ณ , newNode.next = head๋ฅผ ์งํํ๋ฉด next์ ๊ฐ์ด ๋ฌด์์ธ์ง ์ ์ ์๋ค.
โจ addLast(int data)
public void addLast(int data) {
Node newNode = new Node(data);
// ์ฒ์์ผ๋ก ๊ฐ์ ๋ฃ๋๋ค๋ฉด
if(size == 0) {
addFirst(data);
}else {
tail.next = newNode;
tail = newNode;
size++;
}
}
๋ง์ฝ ์ฒซ ๋ฒ์งธ๋ก Node์ ๊ฐ์ ๋ฃ๋ ๊ฒ์ด๋ผ๋ฉด addFirst ํจ์๋ก ๊ฐ์ ๋ฃ๊ณ , ๋ ธ๋์ ๊ฐ์ด ์ค์ ๋ก ์๋ ์ฑ๋ก ๊ฐ์ ๋ฃ๋๋ค๋ฉด ๋ง์ง๋ง ๋ ธ๋์ next๋ฅผ newNode๋ก ํ๋ค. ๊ทธ ํ, tail node๋ฅผ newNode๋ก ์ ์ธํ๋ฉด ๋๋ค.
โจ add(int index, int data)
public void add(int index, int data) {
if(index ==0) {
addFirst(data);
}else {
Node x = node(index-1); // index 2์ ๋ฃ๊ณ ์ถ๋ค๋ฉด index 1์ node
if(x == null) {
return;
}
Node y = x.next; // ์๋ index 2 node
Node newNode = new Node(data);
x.next = newNode;
newNode.next = y;
size ++;
if(newNode.next == null) {
tail = newNode;
}
}
}
// ์ธ๋ถ์์ ์ฌ์ฉํ๋ฉด ์๋จ.
private Node node(int index) {
Node x = head;
for(int i = 0; i<index ;i++ ) {
x = x.next;
if(x == null) {
return null;
}
}
return x;
}
์ํ๋ index๋ก data๋ฅผ add ํ๊ธฐ ์ํด์๋ index์ ์์นํ node๊ฐ ๋ฌด์์ธ์ง ์์์ผ ํ๋ค. ์ด ๋ ์ฌ์ฉํ๋ ํจ์๊ฐ node(int index)์ด๋ค. ์ด ํจ์๋ ์ธ๋ถ์์ ์ฌ์ฉํ๋ฉด ์๋๊ธฐ ๋๋ฌธ์ public์ ๋ถ์ฌ์ฃผ์ง ์๋๋ค.
node(int index)๋ node๋ฅผ head๋ถํฐ ์ฐจ๋ก๋๋ก index์ ๊ฐ๊น์ง ๊ฐ์ ๋ถ๋ฌ์ค๊ณ node๋ฅผ return ํด์ค๋ค.
add(int index, int data)์์ index๊ฐ 0์ด๋ฉด addFirst๋ฅผ ์ฌ์ฉํ๊ณ , ์๋๋ฉด ์์ ์ฝ๋๋๋ก ์งํํ๋ค.
โจ toString()
public String toString() {
String str = "";
Node temp = head;
while(temp.next!=null) {
str += temp.value + ", ";
temp = temp.next;
}
str += temp.value;
return str;
}
โจ remove
1. removeFirst()
2. remove(int index)
3. removeLast()
public int removeFirst() {
if(head == null) {
return -1;
}
Node temp = head;
head = head.next;
int returnData = temp.value;
temp = null;
size --;
return returnData;
}
public int remove(int index) {
if(index == 0) {
return removeFirst();
}else if(node(index-1) == null) {
return -1;
}
else{
Node x = node(index-1);
Node y = x.next; // ์ญ์ ํ ๋
ธ๋
x.next = y.next;
int returnData = y.value;
if(y == tail) {
tail = x;
}
y = null;
size--;
return returnData;
}
}
public int removeLast() {
return remove(size-1);
}
โจ size() & get()
public int size() {
return size;
}
public int get(int index) {
return node(index).value;
}
โจ indexOf
public int indexOf(int data) {
Node temp = head;
int index = 0;
while(head.value != data) {
temp = temp.next;
index ++;
if(temp == null) { // data์ ๊ฐ์ด ์๋ค๋ฉด
return -1;
}
}
return index;
}
โจ ListIterator next, hasNext
//main.class
MyLinkedList.MyListIterator listIterator = numbers.listIterator();
//MyLinkedList.MyListIterator.class
public class MyListIterator{
private Node next;
private Node lastReturned;
private int nextIndex;
public MyListIterator() {
this.next = MyLinkedList.this.head;
this.nextIndex = 0;
}
public int next() {
this.lastReturned = this.next;
this.next = this.next.next;
this.nextIndex ++;
return lastReturned.value;
}
public boolean hasNext() {
return nextIndex < size();
}
}
previous ๋ ธ๋๋ ๊ฐ์ ์ ์ ์๋๋ฐ, ๊ทธ ์ด์ ๋ ๋ ธ๋๋ ํ ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐฉํฅ์ผ๋ก ์๊ธฐ ์ํด์๋ double linkedList๋ฅผ ๊ณต๋ถํด์ผ ํ๋ค.
โจ ListIterator add
public void add(int data) {
Node newNode = new Node(data);
if(lastReturned == null) {
head = newNode;
newNode.next = this.next;
} else {
lastReturned.next = newNode;
newNode.next = this.next;
}
lastReturned = newNode;
nextIndex++;
size ++;
}
โจ ListIterator remove
public void remove() {
if(nextIndex == 0) {
throw new IllegalStateException();
}
MyLinkedList.this.remove(nextIndex-1);
nextIndex--;
}
๊ธฐ์กด remove ์ฝ๋๋ฅผ ์ฌ์ฉํด์, node ํจ์๊ฐ ์คํ๋๋ฏ๋ก ์ค์ฉ์ ์ธ ์ฝ๋๋ ์๋๋ค.
'PS > Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๊ฐ๋ ] LinkedList (0) | 2022.04.10 |
---|---|
ArrayList ๊ตฌํ ๋ฐฉ๋ฒ (MyArrayList) (0) | 2022.04.10 |
[๊ฐ๋ ] ArrayList, ์ฌ์ฉ๋ฒ(create, insert, remove, get, size, indexof, iterator) (0) | 2022.04.09 |
[๊ฐ๋ ] Array vs List, List (0) | 2022.04.09 |
[๊ฐ๋ ] ๋ฐ์ดํฐ ๊ตฌ์กฐ (Data Structure), Array (0) | 2022.04.09 |