在java中获取LinkedList实例

时间:2016-04-07 08:42:32

标签: java linked-list listiterator

我是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)

1 个答案:

答案 0 :(得分:0)

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