如何将始终为“ null”的输出固定为1,2,3“ null”?

时间:2019-10-27 01:36:59

标签: java

我正在编写用于测试某些代码的main方法,但是我的main模式存在一些无法正确测试代码的错误。有人可以帮我解决主要方法中的问题吗?

这是测试课程的一些背景:

将LLNode类输入DrJava:

 /**
   * The node of a linked list
   */
   public class LLNode<T> {
   /** the element stored in the node */
   private T element;

    /** a reference to the next node of the list */
    private LLNode<T> next;

   /**
    * the constructor
    * @param element  the element to store in the node
    * @param next  a reference to the next node of the list
    */
     public LLNode(T element, LLNode<T> next) {
     this.element = element;
     this.next = next;
   }

   /**
    * Returns the element stored in the node
    * @return the element stored in the node
    */
  public T getElement() {
     return element;
  }

  /**
   * Returns the next node of the list
   * @return the next node of the list
   */
  public LLNode<T> getNext() {
    return next;
  }

  /**
   * Changes the node that comes after this node in the list
   * @param next  the node that should come after this node in the 
 list.  It can be null.
   */
  public void setNext(LLNode<T> next) {
    this.next = next;
  }

}

其余代码可在“交互”窗格中输入。如果出现错误,请输入更正的代码。如果您真的很困惑,可以重置“交互”窗格,然后重试。

第1步:编写Java命令以创建以下链接列表,其中变量listHead指向列表的第一个节点:

              +---+---+      +---+---+      +---+---+
listHead ---> | 1 | *-+----> | 2 | *-+----> | 3 | *-+--X
              +---+---+      +---+---+      +---+---+

提示:您可以使用“交互”窗格中的3行代码来完成此操作。 (有趣的是,尝试只用一行执行!)您可以通过键入listHead.getElement(),listHead.getNext()。getElement(),listHead.getNext()。getNext()。getElement()和在“交互”窗格中,单击listHead.getNext()。getNext()。getNext(),如果您的列表正确,则输出应为1、2、3和null。

在上图中,每个框都引用一个LLNode对象,框中的左侧项目是元素,右侧项目是下一个引用。

第2步:尝试创建相同的链表,但是现在使用循环,在该循环中,每次迭代都将创建一个LLNode实例。要创建三个节点,循环将需要迭代3次。 (提示:向前或向后创建列表更容易吗?)

import java.util.*;
public class prelab10 {
     public static void main(String args[]){
          LLNode start = null;
          LLNode end = null;
          int i = 0;
        int size = 3;
      Scanner scan = new Scanner(System.in);

      LLNode list = new LLNode(1,null);
      LLNode list1 = new LLNode(2,null);
      LLNode list2 = new LLNode(3,null);

      start = list; 
      end = start;

      list.setNext(start);
           start = list;

      list1.setNext(start);
           start = list1;

      list2.setNext(start);
           start = list2;

      LLNode a =start ;

      while(i!= size)

      {
          i++;
          System.out.println(a.getElement()+"<->");
          a = a.getNext();
      }
      while(i == 3)
           System.out.println("null");

}     
}

我希望输出从开始到结束都是1,2,3,null而不是null

1 个答案:

答案 0 :(得分:0)

我建议您逐行检查一下您要建造的结构。

实际上,您已经很接近了,您建立的结构是:

list3 -> list2 -> list1 -> list1

请注意,list1指向自身,因此,如果删除行list1.setNext(start),您应该得到:

list3 -> list2 -> list1 -> null

在这里您可以看到:

public class prelab10 {
  public static void main(String args[]){

    LLNode<Integer> start = null;
    LLNode<Integer> end = null;
    LLNode<Integer> list1 = new LLNode<Integer>(1, null);
    LLNode<Integer> list2 = new LLNode<Integer>(2, null);
    LLNode<Integer> list3 = new LLNode<Integer>(3, null);

    start = list1; 
    end = start;
    // start -> list1
    // end -> list1

    // This one is wrong, list1 should NOT point to itself:
    // list1.setNext(start);
    start = list1;
    // list1.next -> start -> list1
    // start -> list1

    list2.setNext(start);
    start = list2;
    // list2.next -> start -> list1
    // start -> list2

    list3.setNext(start);
    start = list3;
    // list3.next -> start -> list2
    // start -> list3

    LLNode cursor = start;
    // cursor -> start -> list3

    // So, what you have build is:
    // list3 -> list2 -> list1 -> list1

    // Removing list1.setNext(start), you would have:
    // list3 -> list2 -> list1 -> null

    // This loop will never end in your original code, as cursor will never be
    // null, as list1's next pointer points to itself:

    while (cursor != null) {
      System.out.print(cursor.getElement() + " -> ");
      cursor = cursor.getNext();
    }

  }     
}

这应该可以帮助您调试和修复代码。

您可能还想以相反的顺序链接/链接节点。