【问题标题】:get LinkedList instance in java在java中获取LinkedList实例
【发布时间】:2016-04-07 08:42:31
【问题描述】:

我是java新手。在自学语言的同时,我一直在尝试做一些测试。现在我在一个链表实现上。我从在线测试样本中删除了代码。有两个文件,LinkedList 和 LinkedListIterator。我很好理解实施。但是,我想向 LinkedList 类添加方法。一种方法 (getString()) 将用于显示链表中所有字符串变量的串联。第二种方法 getSize() 将用于显示列表的大小。我无法获取链表的当前实例,因此我可以迭代并获取字符串和大小。有人可以帮忙吗?帮助将不胜感激。 两个文件如下:

import java.util.NoSuchElementException;

public class LinkedList
{
   //nested class to represent a node
   private class Node
   {
          public Object data;
          public Node next;
   }

   //only instance variable that points to the first node.
   private Node first;

   // Constructs an empty linked list.
   public LinkedList()
   {
      first = null;
   }


   // Returns the first element in the linked list.
   public Object getFirst()
   {
      if (first == null)
       {
         NoSuchElementException ex
             = new NoSuchElementException();
         throw ex;
       }
      else
         return first.data;
   }

   // Removes the first element in the linked list.
   public Object removeFirst()
   {
      if (first == null)
       {
         NoSuchElementException ex = new NoSuchElementException();
         throw ex;
       }
      else
       {
         Object element = first.data;
         first = first.next;  //change the reference since it's removed.
         return element;
       }
   }

   // Adds an element to the front of the linked list.
   public void addFirst(Object element)
   {
      //create a new node
      Node newNode = new Node();
      newNode.data = element;
      newNode.next = first;
      //change the first reference to the new node.
      first = newNode;
   }

   // Returns an iterator for iterating through this list.
   public ListIterator listIterator()
   {
      return new LinkedListIterator();
   }


   public String toString(){

      }

      public int getSize(){
           return this.size();
      }

   //nested class to define its iterator
   private class LinkedListIterator implements ListIterator
   {
      private Node position; //current position
      private Node previous; //it is used for remove() method

      // Constructs an iterator that points to the front
      // of the linked list.

      public LinkedListIterator()
      {
         position = null;
         previous = null;
      }

     // Tests if there is an element after the iterator position.
     public boolean hasNext()
      {
         if (position == null) //not traversed yet
          {
             if (first != null)
                return true;
             else
                return false;
          }
         else
           {
              if (position.next != null)
                 return true;
              else
                 return false;
           }
      }

      // Moves the iterator past the next element, and returns
      // the traversed element's data.
      public Object next()
      {
         if (!hasNext())
          {
           NoSuchElementException ex = new NoSuchElementException();
           throw ex;
          }
         else
          {
            previous = position; // Remember for remove

            if (position == null)
               position = first;
            else
               position = position.next;

            return position.data;
          }
      }

      // Adds an element before the iterator position
      // and moves the iterator past the inserted element.
      public void add(Object element)
      {
         if (position == null) //never traversed yet
         {
            addFirst(element);
            position = first;
         }
         else
         {
            //making a new node to add
            Node newNode = new Node();
            newNode.data = element;
            newNode.next = position.next;
            //change the link to insert the new node
            position.next = newNode;
            //move the position forward to the new node
            position = newNode;
         }
         //this means that we cannot call remove() right after add()
         previous = position;
      }

      // Removes the last traversed element. This method may
      // only be called after a call to the next() method.
      public void remove()
      {
         if (previous == position)  //not after next() is called
          {
            IllegalStateException ex = new IllegalStateException();
            throw ex;
          }
         else
          {
           if (position == first)
            {
              removeFirst();
            }
           else
            {
              previous.next = position.next; //removing
            }
           //stepping back
           //this also means that remove() cannot be called twice in a row.
           position = previous;
      }
      }

      // Sets the last traversed element to a different value.
      public void set(Object element)
      {
         if (position == null)
          {
            NoSuchElementException ex = new NoSuchElementException();
            throw ex;
          }
         else
          position.data = element;
      }

   } //end of LinkedListIterator class
} 

LinkedListIterator 类:

public interface ListIterator
{
   //Move Moves the iterator past the next element.
   Object next();

   // Tests if there is an element after the iterator position.
   boolean hasNext();

   // Adds an element before the iterator position
   // and moves the iterator past the inserted element.
   void add(Object element);


   // Removes the last traversed element. This method may
   // only be called after a call to the next() method.
   void remove();

   // Sets the last traversed element to a different value.
   void set(Object element);
}

尝试执行 getSize() 时出错:

Exception in thread "main" java.lang.StackOverflowError
    at assignment10.LinkedList.size(LinkedList.java:84)
    at assignment10.LinkedList.size(LinkedList.java:84)
    at assignment10.LinkedList.size(LinkedList.java:84)
    at assignment10.LinkedList.size(LinkedList.java:84)

【问题讨论】:

  • 你试过什么?方法是空的。当前实例可以通过关键字this 引用。但我认为这不是问题所在。使用迭代器一一获取值。
  • 您可以在LinkedList 中将int size 作为您的班级成员,然后您可以分别在addremove 方法中增加或减少它。对于字符串表示,您必须创建一个迭代器并遍历所有节点以格式化节点。请参考 Java 的 LinkedList 以获得更好的实现:docs.oracle.com/javase/8/docs/api/java/util/LinkedList.html
  • 为什么不简单地扩展现有的LinkedList?它已经有 size() 方法,所以你可以用你的 getSize() 包装它,如果你只使用里面的字符串,你可以很容易地覆盖 toString() 方法

标签: java linked-list listiterator


【解决方案1】:

getSize() 可能是

public int getSize(){
    int size = 0;
    ListIterator iterator = listIterator();
    while(iterator.hasNext()) {
        iterator.next();
        size++;
    }

    return size;
}

但是每次遍历列表来知道它的大小是没有效率的。更好的解决方案是将大小存储为类变量,并在修改列表的方法中增加或减少。

toString()方法的思路是一样的,遍历列表,将每一项追加到结果字符串中

public String toString(){
    StringBuilder sb = new StringBuilder();
    ListIterator iterator = listIterator();
    while(iterator.hasNext()) {
        sb.append(String.valueOf(iterator.next())).append(",");
    }

    return sb.toString;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多