为什么在尝试在开头添加节点时列表显示为空?

时间:2016-11-04 16:28:26

标签: java oop methods nodes

我真的失去了理智,想弄清楚为什么我的add()print()方法无法奏效。我几乎尝试了一切,但我不能这样做。我知道我的代码是错误的(我甚至无法判断我的代码是否正确,因为我删除它以尝试新的东西)所以它可能有什么问题?

感谢您花时间阅读。

NodeFN类:

public class NodeFN {
     private String data; // Data for node.
     private NodeFN next; // Next node.

public NodeFN(String data) {
    this.data = data; // Take the data value passed in & store it in the data field.
    this.next = null; // Take the next node & store it in the next field.
}

   // Mutator functions.
public String getData() {return data;}
public NodeFN getNext() {return next;}
public void setData(String d) {data = d;}
public void setNext(NodeFN n) {next = n;}
} 

队列类:

public class Queue {
   NodeFN head; // Head of node.
   public String n;

public Queue(String n) { 
    head = new NodeFN(n); // head is now an object of NodeFN which holds a string.
}

public void add(String n) {
    NodeFN nn = new NodeFN(n); // nn is now an object of NodeFN which holds a string, it should return something.
        if(head == null) {
            head = nn;
        }
        while(nn.getData().compareTo(head.getData()) < 0) {
                nn.setNext(head); // Put node in beginning of the list.
                nn.setData(n);      
        }
    }

public void print() {
    NodeFN nn = new NodeFN(n);

    while(nn != null) {
        nn.getNext().getData();
        System.out.println(nn.getData() + " ");
    }
}

public static void main(String[] args) {
    Queue q = new Queue("string to test");
    q.add("another string to test if add method works.");
    q.print();
}
}

3 个答案:

答案 0 :(得分:0)

您正在创建链接列表。要打印它,您需要遍历列表,直到getNext()中的空值为止。基本上,你最终应该得到这样的东西:

public void print() {
   NodeFN current = head;

   while(current != null) {
       System.out.println(current.getData());
       current = current.getNext();
   }
}

对于您的add()方法,我们的想法是将任何新节点基本上作为列表中最后一个节点的next引用。只需在last课程中保留对Queue节点的引用。添加时,将next节点的last设置为新创建的节点,并将新节点设置为last

答案 1 :(得分:0)

我不能说你的添加方法,但这里的n是什么?

public void print() {
    NodeFN nn = new NodeFN(n);

    while(nn != null) {
        nn.getNext().getData();
        System.out.println(nn.getData() + " ");
    }
}

队列类根本不应该关心public String n。您只需要head节点。

然后,nn.getNext().getData();正在返回一些东西,是吗?但是,你不打印它,也不是你在列表中“前进”。 (您不会将nn分配给下一个节点)。

尝试这样的事情

public void print() {
    if (head == null) System.out.println("()");

    NodeFN tmp = head;

    while(tmp != null) {
        System.out.println(tmp.getData() + " ");
        tmp = tmp.getNext();
    }
}

如果您希望在列表的开头添加节点,那么这应该可行。

public void add(String n) {
    NodeFN nn = new NodeFN(n);
    if(head == null) {
        head = nn;
    }

    // Don't use a while loop, there is nothing to repeat
    if (n.compareTo(head.getData()) < 0) {
        // Both these operations put 'nn' in beginning of the list.
        nn.setNext(head); 
        head = nn;
    }
}

答案 2 :(得分:0)

对于add方法,您有正确的想法开始。如果列表中没有元素,请将nn作为头部。否则,将列表遍历到最后一个元素并将其添加到结尾(因为它是一个队列)。

public void add(String n) {
    NodeFN nn = new NodeFN(n);
    if(head == null) {
        head = nn;
    }
    else {
        NodeFN cursor = this.head;
        while(cursor.getNext() != null) {
            cursor = cursor.getNext();
        }
        cursor.setNext(nn);
    }
}

如果你想将新节点添加到开头(出于任何奇怪的原因),它会更容易。

public void add(String n) {
    NodeFN nn = new NodeFN(n);
    nn.setNext(this.head);
    this.head = nn;
}

对于打印方法。您没有设置nn(光标)来引用实际队列中的任何节点。您应该将nn设置为队列的头部,然后遍历队列。 NodeFN nn = this.head。然后在while循环体中打印数据nn.getData(),然后移动到下一个节点nn = nn.getNext()

public void print() {
    NodeFN cursor= this.head;

    while(cursor != null) {
        System.out.println(cursor.getData() + " ");
        cursor= cursor.getNext();           
    }
}