向自定义单向链表增加数据, 出现死循环。debug了好久, 也没看出来原因。鄙视自己了好一会儿后, 决定发到CSDN求救。 多谢了!public class LinkedArray {
private Entry root;
private int count;
public static void main(String[] args) {
LinkedArray la = new LinkedArray();
for (int i = 0; i < 10; i++) {
la.add(i+"");
}
}

public LinkedArray() {

} private class Entry{
private String data;
private Entry next;

private boolean add(String data){//有死循环
while(this.next!=null){
this.next.add(data);
}
if(this.next==null){
this.next = new Entry(data);
}
return true;
}

public Entry(String data) {
this.data = data;
}
}

public boolean add(String value){
if(value == null){
return false;
}
this.count++;
if(root==null){
root = new Entry(value);
}else{
this.root.add(value);
}
return true;
}


}
单向链表死循环

解决方案 »

  1.   

    把if(this.next==null){
                    this.next = new Entry(data);
                }
    这句放到while前面看看
      

  2.   

    这个第二次add的时候Root的next不空不是死了吗while(this.next!=null){
                    this.next.add(data);
                }
      

  3.   

    这个是递归调用,while里面的this.next.add(data),执行后,在第二次调用递归时,this就变成了,上一层的this.next了。
      

  4.   

    最后this.next还是赋值了,还是跳不出循环啊
      

  5.   

    逻辑问题,换个思路吧,这个终止条件不合逻辑,
    按你这逻辑的话,在while里要加上this.next=null;
    试试吧
      

  6.   


    public class LinkedArray {
        private Entry root;
        private int count;
        public static void main(String[] args) {
            LinkedArray la = new LinkedArray();
            for (int i = 0; i < 10; i++) {
                la.add(i+"");
            }       
        }
         
        public LinkedArray() {
             
        }
     
        private class Entry{
            private String data;
            private Entry next;
             
            private boolean add(String data){//有死循环
                while(this.next!=null){
                    this.next.add(data); // 当i为2的时候,死循环是一直添加到root.next
                }
                if(this.next==null){
                    this.next = new Entry(data);
                }
                return true;
            }
             
             
     
            public Entry(String data) {
                this.data = data;
            }
        }
         
        public boolean add(String value){
            if(value == null){
                return false;
            }
            this.count++;
            if(root==null){
                root = new Entry(value);
            }else{
                this.root.add(value);
            }
            return true;
        }
         
         
         
     
    }
      

  7.   

        此处有问题 while(this.next!=null){
                    this.next.add(data); // 当i为2的时候,死循环是一直添加到root.next
          }
      

  8.   

    自己写了一个。import java.util.Iterator;
    /**
     * 带表头的单向链表。
     * 可以用迭代器,遍历里面的元素。
     */
    public class OneWayList<T> implements Iterable<T>{ class Entry{
    T data;
    Entry next;
    public Entry(T data) {
    this.data = data;this.next=null;
    }
    }

    /**
     * 单向链表的表头,表头不存放数据。
     */
    private Entry header = new Entry(null);

    public void add(T data){
    Entry tail = header;
    while(tail.next!=null){
    tail = tail.next;//指针后移
    }
    tail.next = new Entry(data);
    }

    /**
     * 迭代器
     */
    private class Iter implements Iterator<T>{
    Entry p = header;
    public boolean hasNext() {
    return p.next!=null;
    }
    public T next() {
    p = p.next;
    return p.data;
    }
    public void remove() {
    throw new IllegalStateException("Not support this operation.");
    }
    }

    public Iterator<T> iterator() {
    return new Iter();
    }

    /**
     * 测试用例
     */
    public static void main(String[] args) {
    OneWayList<String> la = new OneWayList<String>();         
    for (int i = 0; i < 10; i++) {             
    la.add(i+"");         
    }    
    for(String s :la){
    System.out.println(s);
    }
    }
    }
      

  9.   

    public class LinkedArray {
    private Entry root;
    private int count; public static void main(String[] args) {
    LinkedArray la = new LinkedArray();
    for (int i = 0; i < 10; i++) {
    la.add(i + "fsad");
    }
    } public LinkedArray() {
    }

    public boolean add(String value) {
    if (value == null) {
    return false;
    }
    this.count++;
    if (root == null) {
    root = new Entry(value);
    } else {
    root.add(value);
    }
    return true;
    } private class Entry {
    private String data;
    private Entry next;
    /*
    private boolean add(String data) {// 有死循环
    while(this.next != null) {
    this.next.add(data);
    }
    if (this.next == null) {
    this.next = new Entry(data);
    }
    return true;
    }
    */
    private boolean add(String data) {
    Entry last=null;
    for(last = root;last.next!=null;last=last.next);
    last.next = new Entry(data);
    System.out.println(last.data);
    return true;
    }

    public Entry(String data) {
    this.data = data;
    }
    }
    }
      

  10.   

    修改楼主的代码如下:public class LinkedArray {
    private Entry root;
    private int count; private class Entry {
    private String data;
    private Entry next; public Entry(String data) {
    this.data = data;
    }
    } public boolean add(String value) {
    if (value == null) {
    return false;
    }
    this.count++;
    if (root == null) {//没有表头就要先判断根是否为空
    root = new Entry(value);
    } else {
    Entry tail = root;
    while(tail.next!=null){
    tail = tail.next;
    }
    tail.next = new Entry(value);
    }
    return true;
    }

    public static void main(String[] args) {
    LinkedArray la = new LinkedArray();
    for (int i = 0; i < 10; i++) {
    la.add(i + "");
    }
    }}
      

  11.   

    在大家的帮助下, 我修改了代码并成功实现单向链表加数据。原因:递归本身就有while的特性,然而我在while中又调用了递归,才导致了死循环。我把while改成了if, 就成功执行了。代码如下:
    public class LinkedArray {
    private Entry root;
    private int count;
    public static void main(String[] args) {
    LinkedArray la = new LinkedArray();
    for (int i = 0; i < 10; i++) {
    la.add(i+"");
    }
    System.out.print(la);
    }

    public LinkedArray() {

    } private class Entry{
    private String data;
    private Entry next;

    private boolean add(String data){

    if(this.next!=null){
    this.next.add(data);

    }
    else{
    this.next = new Entry(data);
    }
    // if(this.next==null){
    // this.next = new Entry(data);
    // }
    return true;
    }

    public Entry(String data) {
    this.data = data;
    }
    }

    public boolean add(String value){
    if(value == null){
    return false;
    }
    this.count++;
    if(root==null){
    root = new Entry(value);
    }else{
    this.root.add(value);
    }
    return true;
    }


    }