Computer Science/자료구조

[Java로 배우는 자료구조] 제4-1장: 연결리스트의 개념과 기본연산 (4,5/5)

문에딕트 2022. 3. 17. 13:55
package Ch4_1;

public class MySingleLinkedList<T> {

    //첫번째 노드 주소
    public Node<T> head;
    public int size;

    public MySingleLinkedList() {
        head = null;
        size = 0;
    }

    public void addFirst( T item ){
        Node<T> newNode = new Node<T>(item);     // T: type parameter
        newNode.next = head;
        head = newNode;
        size++;

      //  Node<T> [] arr = new Node<T> [100];  //not ok
      // T t = new T() // not ok
    }

    public void addAfter( Node<T> before, T item ){
        Node<T> tmp = new Node<T>( item );
        tmp.next = before.next;
        before.next = tmp;

        size++;
    }
    //addBefore은 구현하기 간단하지 않다.. add한것 before의 자리를 알아내기 위해 첫번째 자리부터 검색해가야한다

    public void add( int index, T item ){   // insert
        if( index < 0 || index > size)
            return;
        if ( index == 0)
            addFirst( item );
        else{
            Node<T> q = getNode(index-1);
            addAfter( q, item );
        }
    }

    public T removeFirst(){
        if(head == null){
            return null;
        }
        T temp = head.data;
        head = head.next;
        size--;

        return temp;
    }

    public T removeAfter( Node<T> before ){
        if( before.next == null){
            return null;
        }
        T temp = before.next.data;
        before.next = before.next.next;

        return temp;
    }
    

    public T remove( int index ){   // delete
        if( index < 0 || index >= size )
            return null;
        if( index == 0 )
            return removeFirst();
        Node<T> prev = getNode( index-1 );
        return removeAfter( prev );
    }

    public T remove( T item ){   // delete
        Node<T> p = head; 
        Node<T> q = null;
        while( p!= null && !p.data.equals( item )){
            q = p;
            p = p.next;
        }
        if( p == null )
            return null;
        if( q == null )
            return removeFirst();
        return removeAfter(q);  
      }


    public int indexOf( T item ){  // search
        Node<T> p = head; //첫번째 노드 가리키기
        int index = 0;
        while ( p!=null ){
            if(p.data.equals(item)){
                return index;
            }
            p = p.next;
            index++;
        }
        return -1;
    }
    
    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; 
    }

    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;
    }

    public static void main(String[] args){
        MySingleLinkedList<String> list = new MySingleLinkedList<String>();

        list.add(0, "Saturday");
        list.add(1, "Friday");
        list.add(0, "Monday");
        list.add(2, "Tuesday");

        String str = list.get(2);
        list.remove(2);
        int pos = list.indexOf("Friday");

    }
}