繁体   English   中英

Java中的循环链表

[英]Circular Linked List in 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);
}

使用Iterator或您的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的构造函数中,将字段positionnull并且(除非我丢失了某些东西)这永远不会改变。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM