Java do while循环在LinkedList中有问题

时间:2015-09-12 11:47:58

标签: java loops while-loop do-while singly-linked-list

我有这个LinkedList,我在printList()模块中面临一个问题。

public class LinkedList {
    LinkedList next;
    int data;
    public LinkedList(int data) {
        this.data = data;
        this.next = null;
    }
    public void append(int... data) {
        int size = data.length;
        for(int i=0; i<size; i++)   {
            append(data[i]);
        }
    }
    public void append(int data)    {
        LinkedList head = this;
        while(head.next!=null)  {
            head = head.next;
        }
        head.next = new LinkedList(data);
    }
    public void printList() {
        LinkedList head = this;
        StringBuffer sb = new StringBuffer();
        do  {
            sb.append(head.data+", ");
            head=head.next;
        }   while(head.next!=null);
        System.out.println(sb.toString());
        while(head.next!=null)  {
            sb.append(head.data+", ");
            head=head.next;
        }   
        System.out.println(sb.toString());
    }
}

但是printList中的do和print一样打印。这是为什么?有人能帮我吗?

由于 杰文

3 个答案:

答案 0 :(得分:1)

由于在第一个while循环head.next为空之后,永远不会输入第二个while循环。

因此这段代码:

public void printList() {
    LinkedList head = this;
    StringBuffer sb = new StringBuffer();
    do  {
        sb.append(head.data+", ");
        head=head.next;
    }   while(head.next!=null);
    System.out.println(sb.toString());
    while(head.next!=null)  {
        sb.append(head.data+", ");
        head=head.next;
    }   
    System.out.println(sb.toString());
}

等同于此代码:

public void printList() {
    LinkedList head = this;
    StringBuffer sb = new StringBuffer();
    do  {
        sb.append(head.data+", ");
        head=head.next;
    }   while(head.next!=null);
    System.out.println(sb.toString());  
    System.out.println(sb.toString());
}

即。您正在打印具有相同内容的相同StringBuffer实例两次。

编辑:

如果您想要打印最后一个元素,请更改

while(head.next!=null)

while(head!=null)

答案 1 :(得分:1)

您的打印方法存在问题,如果是最后一个元素

        head=head.next;
    }   while(head.next!=null);

head将存储其引用,但由于它是最后一个元素,因此它后面没有下一个元素,这意味着条件head.next!=null将在您能够追加{之前停止循环{1}}在此元素中。

您可以将方法重写为

data

对我来说更具可读性。

答案 2 :(得分:0)

我认为以上所有解决方案都很好,但我只是想给你一个像打印方法的列表: - )

public void printList() {
    Node temp = this.next;
    StringBuilder sb = new StringBuilder();
    sb.append(data).append("-->");
    while (temp != null) {
        sb.append(temp.data).append("-->");
        temp= temp.next;
    }
    sb.append("NULL");
    return sb.toString();
}