2016-11-21 7 views
1

Мне нужно написать программу Java (класс LinkedList), которая должна делать все, не используя список импорта, и я попытался, но я не уверен, работают ли они или нет.LinkedList getFirstElement и getLastElement Methods

Может кто-нибудь, пожалуйста, помогите мне? Особенно методы getFirstElement и getLastElement.

Вот мои классы:

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 является 'если (head.getNext() == NULL) {возвращает данные;} еще {вернуть GetNext () .getLastElement();} 'Where next(). getLastElement - это рекурсивный вызов. – MrKickkiller

+0

Метод getFirst работает, но getLast не работает. но спасибо в любом случае. – meert

ответ

1

getFirstElement() и getLastElement()

/* Если предположить, что элементы в вашем списке ссылок: , хранящиеся в переменная данные класса Node */

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

В getFirst вы литье head элемента E и head имеет типа ListNode. Вам нужно вернуть head.data, а не head. То есть, если вы действительно хотите значение, а не элемент, если вы хотите, чтобы этот элемент просто вернул head и изменил тип возврата на ListNode.

Я не понимаю вашего getLast Тхо, вы делаете новый элемент, а затем проверить, если это нуль (?), А затем снова бросая его E, когда это ListNode. Вам нужно перебирать весь список, чтобы добраться до последнего элемента, а затем вернуть его, что-то вроде:

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

Тогда как я писал ранее, вы можете вернуть любой элемент или значение. Конечно, вам нужно позаботиться о возможных нулевых указателях, таких как head, являющихся нулями и т. Д., Но вы это знаете.

1

Существует два варианта: итеративный и постоянный.

В ИТЕРАЦИОННОМ у вас есть голова, указывающая на первый узел, так что получить первый элемент просто назвать head.data(), но для последнего элемента вы должны итерацией с некоторым временем/цикл до сиггепЬЫойи .next()! = null

В опции с постоянным временем у вас есть два указателя, один для головы, другой для последнего элемента. Для получения первого элемента это то же самое, что и итеративный способ, но для получения последнего, вы должны использовать указатель last, чтобы вернуть значение. Сложная вещь здесь - иметь контроль над добавлением/удалением элементов для обновления de последнего узла.

Очень простой пример может быть:

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

} 

"Графически" может быть как:

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


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