【问题标题】:LinkedList getFirstElement and getLastElement MethodsLinkedList getFirstElement 和 getLastElement 方法
【发布时间】:2017-04-05 01:48:20
【问题描述】:

我需要编写一个 Java 程序(LinkedList 类),它应该在不使用 import List 的情况下完成所有工作,我已经尝试过,但我不确定它们是否正常工作。

有人可以帮帮我吗?尤其是 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;
        }


    }

【问题讨论】:

  • getFirstElement 应该是简单的return head.getData()
  • getLastElement 是 if (head.getNext() == null){return data;} else {return getNext().getLastElement();} 其中 next().getLastElement 是递归调用。
  • getFirst 方法有效,但 getLast 无效。不过还是谢谢你。
  • 刚刚写了一个编辑,但是发生了错误; getLastElement 是 if (head.getNext() == null){return data;} else {return getNext().getLastElement();} 其中 next().getLastElement 是递归调用。
  • getLast 应该与您的 addLast 函数的逻辑相同,只是您不添加新节点,而是返回最后一个不为空的节点

标签: java interface linked-list inner-classes


【解决方案1】:

getFirst 中,您将head 元素转换为E,而head 的类型为ListNode。您需要返回head.data,而不是head 本身。也就是说,如果你真的想要值,而不是元素,如果你想要元素,那么只需返回 head 并将返回类型更改为 ListNode

我不明白你的getLast tho,你正在创建一个新元素,然后检查它是否为空(?),然后当它是 ListNode 时再次将其转换为 E。您需要迭代整个列表以到达最后一个元素,然后返回它,例如:

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

然后就像我之前写的那样,您可以返回元素或值。当然,您需要注意可能的空指针,例如 head 为空等,但您知道这一点。

【讨论】:

    【解决方案2】:

    有两个选项,迭代选项和恒定时间选项。

    迭代中你有一个头指向第一个节点,所以获取第一个元素只是调用head.data(),但对于最后一个元素你必须迭代一段时间/ for 循环直到 currentNode.next()!=null

    恒定时间选项中,您有两个指针,一个指向头部,另一个指向最后一个元素。获取第一个元素与迭代方式相同,但获取最后一个元素,必须使用 last 指针返回值。这里的复杂之处在于控制添加/删除元素以更新 de last 节点。

    一个非常基本的例子可能是:

    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 --------------/
    

    【讨论】:

      【解决方案3】:

      getFirstElement() 和 getLastElement()

      /* 假设链接列表中的 元素 存储在 Node 类的变量 data */

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

      【讨论】:

        猜你喜欢
        • 2011-12-01
        • 2014-05-19
        • 2021-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-26
        • 1970-01-01
        相关资源
        最近更新 更多