簡體   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