diff --git "a/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedList.java" "b/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedList.java" new file mode 100644 index 0000000..e9f71d7 --- /dev/null +++ "b/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedList.java" @@ -0,0 +1,466 @@ +package kr.kmooc.dataEngineering.homework2_3; + +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; +import java.util.Queue; + +public class MyLinkedList implements List, Queue{ + + private MyNode first; // 첫번째 노드 + private MyNode last; // 마지막 노드 + private int size; // 데이터의 개수 + + public MyLinkedList() { + first = null; + last = null; + size=0; + } + + public MyLinkedList(Collection c) { + this(); // 빈 링크드리스트 생성 + for(E value:c) { // Collection이기 때문에, for-each loop사용가능 + add(value); // 컬렉션을 전부 순회해서 add해주면 생성끝남 + } + } + + @Override + public boolean offer(E e) { + if(first == null ) { + // 비어 있을 때 + MyNode newNode = new MyNode (null, e,null); + first= newNode; + last = newNode; + size++; + } + else { + // 비어 있지 않을 때 + MyNode newNode = new MyNode (last, e, null); + last.setNext(newNode); + last = newNode; + size++; + } + return true; + } + + @Override + public E remove() { + if(size==0) { + throw new NoSuchElementException(); + } + else { + return remove(0); + } + } + + + @Override + public E poll() { + if(size==0) { + return null; + } + else { + return remove(0); + } + } + + @Override + public E element() { + if(size ==0) { + throw new NoSuchElementException(); + } + else { + return get(0); + } + } + + @Override + public E peek() { + if(size ==0) { + return null; + } + else { + return get(0); + } + } + + @Override + public int size() { + return size; // size변수가 있기 때문에 그대로 반환 + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean contains(Object o) { + if(size ==0) + return false; + MyNode cursor = first; + do { + if(cursor.getItem().equals(o)) + return true; + cursor = cursor.getNext(); + + }while(cursor!=null); + return false; + + } + + @Override + public Object[] toArray() { + Object[] array = new Object[size]; + int idx =0; + for(E val : this) { + array[idx++] = val; + } + return array; + } + + @Override + public T[] toArray(T[] a) { + // TODO Auto-generated method stub + return null; + } + + @Override + public boolean add(E e) { + if(first == null ) { + // 비어 있을 때 + MyNode newNode = new MyNode (null, e,null); + first= newNode; + last = newNode; + size++; + } + else { + // 비어 있지 않을 때 + MyNode newNode = new MyNode (last, e, null); + last.setNext(newNode); + last = newNode; + size++; + } + return true; + } + + + + @Override + public String toString() { + if( size == 0) { + return "[]"; + } + + String result = "["; + result += first.getItem(); + MyNode cursor = first.getNext(); // 노드를 가르키는 객체 + + while(cursor!=null) { + result += "," + cursor.getItem(); + cursor = cursor.getNext(); // 커서가 다음 노드를 가리키도록 갱신 + } + + result += "]"; + return result; + + } + + + + @Override + public boolean containsAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean addAll(int index, Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean removeAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public boolean retainAll(Collection c) { + // TODO Auto-generated method stub + return false; + } + + @Override + public void clear() { + while(size!=0) { + remove(0); + } + + } + + + @Override + public E get(int index) { + if(index >=size || index<0) + throw new IndexOutOfBoundsException("Index " + index + " out of bounds for length " + size); + + int cIdx=0; + MyNode cursor = first; + do { + if(cIdx == index) + return cursor.getItem(); + cursor = cursor.getNext(); + cIdx++; + }while(cursor!=null); + + return null; + } + + // iterator할때 만듦 + public MyNode getNode(int index) { + if(index >=size || index<0) + throw new IndexOutOfBoundsException("Index " + index + " out of bounds for length " + size); + + int cIdx=0; + MyNode cursor = first; + do { + if(cIdx == index) + return cursor; + cursor = cursor.getNext(); + cIdx++; + }while(cursor!=null); + + return null; + } + + + + +// // 안에서만 쓸거기 때문, add(index,element)만들때 추가함 +// private MyNode getNode(int index) { +// if(index >=size || index<0) +// throw new IndexOutOfBoundsException("Index " + index + " out of bounds for length " + size); +// +// int cIdx=0; +// MyNode cursor = first; +// do { +// if(cIdx == index) +// return cursor; // 커서 반환 +// cursor = cursor.getNext(); +// cIdx++; +// }while(cursor!=null); +// +// return null; +// } +// + + +// // 수정 +// @Override +// public void add(int index, E element) { +// if(index > size || index < 0) +// throw new IndexOutOfBoundsException(); +// +// if(size==index) { +// // 가장 마지막에 추가 +// add(element); +// } +// else { +// // 중간에 추가 +// // first와 last가 다름 +// MyNode next = getNode(index); +// MyNode prev = next.getPrev(); +// // 새로운 노드 추가 +// MyNode newNode = new MyNode ( prev,element,next); +// // prev에 대한 참조 재조정 +// if(prev != null) { +// // 처음 위치에 추가하는 것이 아님 +// prev.setNext(newNode); +// } +// else { +// first = newNode; +// } +// next.setPrev(newNode); +// } +// size++; +// +// } +// + + + @Override + public void add(int index, E element) { + if (index > size || index < 0) + throw new IndexOutOfBoundsException(); + + if (index == size) { + // 리스트 끝에 추가 + MyNode newNode = new MyNode(last, element, null); + if (last != null) { + last.setNext(newNode); + } else { + first = newNode; // 리스트가 비어있었음 + } + last = newNode; + } else { + // 중간에 삽입 + MyNode next = getNode(index); + MyNode prev = next.getPrev(); + MyNode newNode = new MyNode(prev, element, next); + if (prev != null) { + prev.setNext(newNode); + } else { + first = newNode; // 처음에 삽입 + } + next.setPrev(newNode); + } + size++; + } + + + + @Override + public E set(int index, E element) { + MyNode node = getNode(index); + E previousOne = node.getItem(); + node.setItem(element); + return previousOne; + } + + @Override + public E remove(int index) { // 인덱스 기반 리무브 + MyNode nodeToRemove = getNode(index); + E element = nodeToRemove.getItem(); + MyNode next = nodeToRemove.getNext(); + MyNode prev = nodeToRemove.getPrev(); + + if(prev == null) { + // nodeToRemove가 first였음 + first = next; + } + else { + prev.setNext(next); + } + + if(next ==null) { + // nodeToremove 가 last였음 + last = prev; + } + else { + next.setPrev(prev); + } + size--; + + return element; // 지워야할 node를 getnode()로 참조하고, prev와 next를 갱신하여 해당 노드를 list에서 빠져나오게함 + + } + + + @Override + public boolean remove(Object o) { // 인스턴스 기반 remove + MyNode nodeToRemove = getNode(o); + if(nodeToRemove == null) + return false; + + + MyNode next = nodeToRemove.getNext(); + MyNode prev = nodeToRemove.getPrev(); + if(prev == null) { + // nodeToRemove가 first였음 + first = next; + } + else { + prev.setNext(next); + } + + if(next ==null) { + // nodeToremove 가 last였음 + last = prev; + } + else { + next.setPrev(prev); + } + size--; + return true; + } + + // remove인스턴스 만들때 추가함, 인스턴스 기반으로 타켓노드를 찾는 메서드 + private MyNode getNode(Object o) { + int cIdx=0; + MyNode cursor = first; + do { + if(cursor.getItem().equals(o)) + return cursor; // 커서 반환 + cursor = cursor.getNext(); + cIdx++; + }while(cursor!=null); + + return null; + } + + + + @Override + public int indexOf(Object o) { + if(size == 0) + return -1; + + int cIdx = 0; + MyNode cursor = first; + do { + if(cursor.getItem().equals(o)) + return cIdx; + cursor = cursor.getNext(); + cIdx++; + }while(cursor!=null); + return -1; + } + + @Override + public int lastIndexOf(Object o) { // 뒤에서 부터 순회, size조건은 필요없음 + int cIdx = size-1; + MyNode cursor = last; + do { + if(cursor.getItem().equals(o)) + return cIdx; + cursor = cursor.getPrev(); + cIdx--; + }while(cursor!=null); + return -1; + } + + + + @Override + public Iterator iterator() { + return new MyLinkedListListIterator(this,0); + } + + + @Override + public ListIterator listIterator() { + return new MyLinkedListListIterator(this,0); + } + + @Override + public ListIterator listIterator(int index) { + return new MyLinkedListListIterator(this, index); + } + + @Override + public List subList(int fromIndex, int toIndex) { + // TODO Auto-generated method stub + return null; + } + +} diff --git "a/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedList.jpg" "b/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedList.jpg" new file mode 100644 index 0000000..522cf24 Binary files /dev/null and "b/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedList.jpg" differ diff --git "a/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedListListIterator.java" "b/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedListListIterator.java" new file mode 100644 index 0000000..4702012 --- /dev/null +++ "b/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyLinkedListListIterator.java" @@ -0,0 +1,78 @@ +package kr.kmooc.dataEngineering.homework2_3; + +import java.util.ListIterator; + +public class MyLinkedListListIterator implements ListIterator { + + private MyLinkedList data; + private int cursor; + private MyNode lastReturned; + + public MyLinkedListListIterator(MyLinkedList data , int index) { + this.data = data; + this.cursor = index-1; + } + + @Override + public boolean hasNext() { + if(cursor + 1 < data.size()) + return true; + else + return false; + } + + @SuppressWarnings("unchecked") + @Override + public E next() { + lastReturned = data.getNode(++cursor); + return (E)lastReturned.getItem(); + } + + + @Override + public boolean hasPrevious() { + if(cursor >= 0) + return true; + return false; + } + + @SuppressWarnings("unchecked") + @Override + public E previous() { + lastReturned = data.getNode(cursor); + return (E) data.get(cursor--); + } + + @Override + public int nextIndex() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public int previousIndex() { + // TODO Auto-generated method stub + return 0; + } + + @Override + public void remove() { + // TODO Auto-generated method stub + + } + + @Override + public void set(E e) { + lastReturned.setItem(e); + + } + + @Override + public void add(E e) { + // TODO Auto-generated method stub + + } + + + +} diff --git "a/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyNode.java" "b/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyNode.java" new file mode 100644 index 0000000..ad8a60c --- /dev/null +++ "b/data-engineering/src/main/java/kr/ac/sejong/kmooc/data_engineering/\352\263\274\354\240\2342-3_21013341_\354\225\210\355\232\250\354\243\274/MyNode.java" @@ -0,0 +1,47 @@ +package kr.kmooc.dataEngineering.homework2_3; + +public class MyNode { + private E item; + private MyNode prev; + private MyNode next; + + /** + * MyLinkedList용 새로운 MyNode를 생성한다. + * + * @param prev 이전노드 + * @param item 아이템 + * @param next 다음노드 + */ + + public MyNode(MyNode prev, E item, MyNode next){ + this.prev = prev; + this.item = item; + this.next = next; + } + + public E getItem() { + return item; + } + + public void setItem(E item) { + this.item = item; + } + + public MyNode getPrev() { + return prev; + } + + public void setPrev(MyNode prev) { + this.prev = prev; + } + + public MyNode getNext() { + return next; + } + + public void setNext(MyNode next) { + this.next = next; + } + + +}