2016-11-21 15 views
1

インポートリストを使用せずにすべての処理を行うJavaプログラム(LinkedListクラス)を作成する必要がありますが、試してみましたが、動作しているかどうかはわかりません。LinkedList getFirstElementとgetLastElementのメソッド

誰かお手伝いできますか?特にgetFirstElementメソッドとgetLastElementメソッドここで

は私のクラスです:getFirst

package main.java.a3; 

public interface List<E> { 
    public void add(E e); 
    public void add(int index, E e); 
    public int size(); 
    public E get(int index); 
    public boolean isEmpty(); 
} 




package main.java.a3; 

    import java.util.NoSuchElementException; 

    public class LinkedList<E> implements List<E>{ 

     private ListNode head; 

     @Override 
     public void add(E e) { 
      if(e == null){ 
       throw new NullPointerException("Element was null"); 
      } 
      if(head == null){ 
       head = new ListNode(e,null); 
      }else{ 
        ListNode temp = head; 
        while(temp.next!=null){ 
         temp=temp.next; 
        } 
        temp.setNext(new ListNode(e,null)); 
       } 
     } 

     @Override 
     public void add(int index, E e) { 
      if(e == null) { 
       throw new NullPointerException("Element was null!"); 
      } 
      else if(index<0){ 
       throw new IndexOutOfBoundsException("Index was negative"); 
      } 
      else if(index>=size() + 1){ 
       throw new IndexOutOfBoundsException("Index was bigger than size"); 
      } else { 
       ListNode temp = head; 
       while(temp.next != null) { 
        temp = temp.next; 
       } 
       temp.setNext(new ListNode(e, null)); 
      } 

     } 

     @Override 
     public int size() { 
      int size = 0; 
      ListNode temp = head; 
      while(temp != null) { 
       size++; 
       temp = temp.getNext(); 
      } 
       return size; 
     } 

     @Override 
     public E get(int index) { 
      if(index<0){ 
       throw new IndexOutOfBoundsException("Index was negative"); 
      } 
      if(index>=size()){ 
       throw new IndexOutOfBoundsException("Index was bigger than size"); 
      } 
      ListNode temp = head; 
      for (int i = 0; i<index;i++){ 
       temp = temp.next; 
      } 
      return temp.data; 
     } 

     @Override 
     public boolean isEmpty() { 
      if(head == null) { 
       return true; 
      } else { 
       return false; 
      } 
     } 

       // innere Klasse   
         private class ListNode{ 
          E data; 
          ListNode next; 

          public ListNode(E data, ListNode next){ 
           setData(data); 
           setNext(next); 
          } 

          public void setData(E data){ 
           this.data = data; 
          } 

          public void setNext(ListNode next){ 
           this.next = next; 
          } 

          public E getData() { 
           return data; 
          } 

          public ListNode getNext() { 
           return next; 
          } 

         } 
       // innere Klasse  

     public String toString() { 
       return head.toString(); 
     } 

     public void addFirst(E elem) { 
      if(elem == null) { 
       throw new NullPointerException("Element was null!"); 
      } else { 
       ListNode temp = new ListNode(elem, head); 
       if(head != null) { 
        temp.setNext(head); 
       } 
       head = temp; 
      } 
     } 

     public void addLast(E elem) { 
      if(elem == null) { 
       throw new NullPointerException("Element was null!"); 
      } else { 
       ListNode tail = new ListNode(elem, null); 
       while(head != null) { 
        tail.getNext(); 
        if(tail.getNext() == null) { 
         tail.setNext(head); 
        } 
       } 
      } 
     } 

     public E getFirst() { 
      if(head == null) { 
       throw new NoSuchElementException("Element was null!"); 
      }else { 
       return (E) head; 
      } 

     } 

     public E getLast(){ 
      E elem = null; 
      ListNode tail = new ListNode(elem, null); 
      if(tail == null) { 
       throw new NoSuchElementException("Element was null!"); 
      } 
      return (E) tail; 
     } 


    } 
+3

getFirstElementは単に 'head.getData()' – MrKickkiller

+1

getLastElementある 'IF(head.getNext()== NULL)が返さなければならない{戻りデータ;}そうでなければ{(getNextをを返します).getLastElement();} 'next()。getLastElementは再帰呼び出しです。 – MrKickkiller

+0

getFirstメソッドは機能していますが、getLastは機能しません。とにかくありがとう。 – meert

答えて

1

getFirstElement()とgetLastElement()

public class LinkedList<E> implements List<E>{ 
    private ListNode<E> head; 
    private ListNode<E> last; 
    private int size; 

    public E getFirst(){ 
     if(head!=null) 
      return head.data(); 
     else 
      return null; 
    } 

    public E getIterativeLast(){ 
     if(head!=null){ 
      ListNode<E> last = head; 
      for(;last.next()!=null; last=last.next()); 
      return last.data(()); 

     }else{ 
      return null; 
     } 
    } 


    public E getConstantLast(){ 
     if(last != null){ 
      return last.data(); 
     }else{ 
      return null; 
     } 

    } 

    public void add(E elem){ 
     LastNode<E> newElem = new LastNode(elem); 
     if(head == null){ 
      head = last = newElem; 
     }else{ 
      last.setNext(newElem); 
      last = newElem: 
     } 
     size++; 
    } 

} 

"グラフィカル" などとすることができあなたのリンクリストのに格納されています。データノードクラスの*/

public E getFirst() { 
      if(head == null) { 
       throw new NoSuchElementException("Element was null!"); 
      }else { 
       return (E) head.data; 
      } 

     } 

     public E getLast(){ 
      if(head == null) { 
       throw new NoSuchElementException("Element was null!"); 
      } 
      else{ 
       for(Node iterate=head; iterate!=null; iterate=iterate.next){ 
        return (E) iterate.data; 
       } 

      } 
     } 
1

あなたはEheadhead要素をキャストしているタイプListNodeです。 ではなく、head.dataを返す必要があります。つまり、要素を必要とする場合は、要素ではなく値を実際に使用する場合は、headを返し、戻り値の型をListNodeに変更します。

getLastあなたが新しい要素を作成していて、それがヌル(?)であるかどうかを確認していて、それがのときにEにキャストしています。私は前に書いたようにその後、あなたはどちらかの要素または値を返すことができ

ListNode temp = head; 
while(temp.next != null) 
    temp = temp.next; 
return temp.data; 

:あなたは最後の要素を得るためにあなたの全体のリストを反復処理する必要があり、その後、何かのように、それを返します。もちろん、headのようなnullpointerの世話をする必要がありますが、あなたはそれを知っています。

1

繰り返し回数と定数時間の2つのオプションがあります。 反復

あなたが最初のノードを指して頭を持っているので、最初の要素を取得することはhead.data()を呼び出すだけですが、最後の要素のためにあなたはcurrentNodeのまで、ループのために/しばらくして反復処理する必要があります.next()!= null

の定数時間には、頭のためのポインタと最後の要素のポインタという2つのポインタがあります。最初の要素を取得するには反復方法と同じですが、最後の要素を取得するには最後のポインタを使用して値を返す必要があります。複雑なことは、最後のノードを更新する要素の追加/削除を制御することです。

非常に基本的な例があり得る:要素を想定*/

head ---> n1|->n2|->null 
      /
last ---------/ 


head ---> n1|->n2|->n3->null 
        /
last --------------/ 
関連する問題