ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • LinkedList
    Algorithm 2020. 8. 31. 16:36
    public class Node<T> {
    
        public T data;
        public Node<T> next;
    
        public Node(T data) {
            this.data = data;
            this.next = null;
        }
    }
    
    public class MySingleLinkedList<T> {
    
        public Node<T> head = null;
        public int size = 0;
    
        public MySingleLinkedList() {}
    
        public void addFirst(T item) {
            Node<T> newNode = new Node<T>(item);
            newNode.next = head;
            head = newNode;
            size++;
        }
    
        public void addAfter(Node<T> before, T item) {
            Node<T> newNode = new Node<T>(item);
            newNode.next = before.next;
            before.next = newNode;
            size++;
        }
    
        // 연결리스트의 index번째 위치에 새로운 데이터를 삽입한다.
        public void add(int index, T item) {
            if (index < 0 || index > size) {
                return; // 추후에 throw
            }
            if (index == 0) {
                addFirst(item);
            } else {
                Node<T> node = getNode(index - 1);
                addAfter(node, item);
            }
        }
    
        public T removeFirst() {
            if (head == null) {
                return null;
            } else {
                T temp = head.data;
                head = head.next;
                size--;
                return temp; // 삭제된 데이터 리턴
            }
        }
    
        public T removeAfter(Node<T> before) {
            if (before.next == null) {
                return null;
            } else {
                T temp = before.next.data;
                before.next = before.next.next;
                size--;
                return temp; // 삭제된 데이터 리턴
            }
        }
    
        // index 번째 노드를 삭제하고, 그 노드에 저장된 데이터 반환
        public T remove(int index) {
            if (index < 0 || index >= size) {
                return null;
            } else if (index == 0) {
                return removeFirst();
            } else {
                Node<T> prev = getNode(index - 1);
                return removeAfter(prev);
            }
        }
    
        // item 을 가진 노드를 찾아 삭제한다. 삭제된 노드에 저장된 값을 리턴
        public T remove(T item) {
            Node<T> p = head;
            Node<T> q = null;
            while ( p!= null && !p.data.equals(item)) {
                q = p;
                p = p.next;
            }
    
            if (p == null) { // 삭제할 노드가 존재하지 않는 경우, LinkedList가 empty일 경우
                return null;
            }
            if (q == null) {
                return removeFirst(); // 찾고있는 노드가 첫 번째 노드일 경우
            } else {
                return removeAfter(q); // 일반적인 경우
            }
        }
    
        // 검색
        public int indexOf(T item) {
            Node<T> p = head; // 임시값
            int index = 0;
    
            while (p != null) {
                if (p.data.equals(item)) {
                    return index;
                }
                p = p.next;
                index++;
            }
            return -1;
        }
    
        // 연결리스트의 index번째 노드의 주소를 반환한다 .
        public Node<T> getNode(int index) {
            if (index < 0 || index >= size) {
                return null;
            }
            Node<T> p = head;
            for (int i = 0; i < index; i++) {
                p = p.next;
            }
            return p;
        }
    
        // index번째 노드에 저장된 데이터를 반환한다.
        public T get (int index) {
            if (index < 0 || index >= size) {
                return null;
            }
            Node<T> p = head;
            for (int i = 0; i < index; i++) {
                p = p.next;
            }
            return p.data;
            // return getNode(index).data; 로 표현가능
            // 이렇게 사용 할 경우 위에 if문은 필요하다
        }
    
    
    }
    

     

     

     


    ※참조

    www.youtube.com/watch?v=3BMnWg5k0fU&list=PL52K_8WQO5oWz_LYm3xg23m5q9qJXoE4n&index=39

    'Algorithm' 카테고리의 다른 글

    트리 정리  (0) 2020.09.07
    그리디&구현, DFS&BFS  (0) 2020.09.01
    EOF (End of File)  (0) 2020.08.29
    정렬 정리  (0) 2020.08.27
    검색 정리  (0) 2020.07.13
킹수빈닷컴