Java中的循环链表



我是java的新手,我正在做一个链表的作业。我得到了一个测试类,我只需要在链表类的特定位置插入我的代码。首先,我面临的问题是,我无法打印我的列表,看看我的代码是否正常工作,或者我是否取得了任何进展。测试文件使用"printList(nameOftheList)",但是不打印列表中的任何元素。我尝试使用System.outprintln(nameOftheList)进行测试,但我得到了我认为是列表的位置,而不是列表上的元素。我在这个程序上工作了几天,现在我理解了链表,但是我的书只涵盖了这么多,我还没有能够应用我在网上找到的任何东西。

如果有人能给我指一下正确的方向,我会非常感激的。

这里是给定的测试器:

测试人员:

public class AddTester
{  
   public static void main(String[] args)
   {  
      LinkedList names = new LinkedList();
      names.addFirst("Tom");
      names.addFirst("Harry");
      names.addFirst("Dick");
      names.add("Romeo");
      printList(names);
      System.out.println("Expected: Dick Harry Tom Romeo");
      ....

这是我正在学习的课程:

import java.util.NoSuchElementException;
/**
A circular linked list.
 */
public class LinkedList
{  
    private Node last;
    // Don't add other instance fields
/** 
Constructs an empty linked list.
 */
public LinkedList()
{  
    last = null;
}
/**
Returns the first element in the linked list.
@return the first element in the linked list
 */
public Object getFirst()
{  
    //. . .
    if (last == null) 
        throw new NoSuchElementException();
    return last.data;
}
/**
Removes the first element in the linked list.
@return the removed element
 */
public Object removeFirst()
{  
    //. . .
    if (last == null)
        throw new NoSuchElementException();
    Object element = last.data;
    last = last.next;
    return element;
}
/**
Adds an element to the front of the linked list.
@param element the element to add
 */
public void addFirst(Object element)
{  
    //. . .
    Node newNode = new Node();
    newNode.data = element;
    newNode.next = last;
    last = newNode;
}
/**
Adds an element to the end of the linked list.
@param element the element to add
 */
public void add(Object element)
{  
    //. . .
    if (last == null)
    {
        addFirst(element);
        //position = last;
    }
    else
    {
        Node newNode = new Node();
        newNode.data = element;
        newNode.next = last.next;
        last.next = newNode;
        last = newNode;
    }
    last = last;
}
/**
Returns an iterator for iterating through this list.
@return an iterator for iterating through this list
 */
public ListIterator listIterator()
{  
    return new LinkedListIterator();
}
private class Node
{  
    public Object data;
    public Node next;
}
private class LinkedListIterator implements ListIterator
{              
    private Node position;
    private Node previous;
    /**
    Constructs an iterator that points to the front
    of the linked list.
     */
    public LinkedListIterator()
    {  
        position = null;
        previous = null;
    }
    /**
    Moves the iterator past the next element.
    @return the traversed element
     */
    public Object next()
    {  
        //. . .
        if (!hasNext())
            throw new NoSuchElementException();
        previous = position; //rmbr for remove
        if (position == null)
            position = last;
        else
            position = position.next;
        return position.data;
    }
    /**
    Tests if there is an element after the iterator 
    position.
    @return true if there is an element after the iterator 
    position
     */
    public boolean hasNext()
    {  
        //. . .
        if (position != null)
            return true;
        else 
            return false;
    }
    /**
    Adds an element before the iterator position
    and moves the iterator past the inserted element.
    @param element the element to add
     */
    public void add(Object element)
    {  
        //. . .
        if (position == null)
        {
            addFirst(element);
            position = last;
        }
    }
    /**
    Removes the last traversed element. This method may
    only be called after a call to the next() method.
     */
    public void remove()
    {  
        //. . .
        if (previous == position)
           throw new IllegalStateException();
         if (position == last)
        {
            removeFirst();
        }
         else
         {
             previous.next = position.next;
        }
        position = previous;
    }
    /**
    Sets the last traversed element to a different 
    value. 
    @param element the element to set
     */
    public void set(Object element)
    {
        if (position == null)
            throw new NoSuchElementException();
        position.data = element;
    }
}

}

这是迭代器:

public interface ListIterator
{  
   /**
      Moves the iterator past the next element.
      @return the traversed element
   */
   Object next();
   /**
      Tests if there is an element after the iterator 
      position.
      @return true 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.
      @param element the element to add
   */
   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. 
      @param element the element to set
   */
   void set(Object element);
}

使用迭代器或您的LinkedList:

    static String printList(LinkedList names){
            StringBuilder sb = new StringBuilder("Expected : ");
            ListIterator st = names.listIterator();
            while(st.hasNext()){
                //Here implements stuff to get the element of your linkedList and add 
               //it to the StringBuilder
            }
            return sb.toString();
    }

LinkedListIterator的构造函数中,您将字段position设置为null,并且(除非我错过了一些东西)这永远不会改变。

然后,在hasNext()中,检查position == null是否存在,如果存在则返回false。

这意味着,如果printList正在使用您的LinkedListIterator,它可能正在检查hasNext()以确定何时停止打印。由于您的hasNext()总是返回false,因此printList只能假设它正在查看空列表。

相关内容

  • 没有找到相关文章

最新更新