向自定义单向链表增加数据, 出现死循环

jige_hanhan 2013-10-22 04:24:27
向自定义单向链表增加数据, 出现死循环。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;
}




}
...全文
351 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jige_hanhan 2013-10-24
  • 打赏
  • 举报
回复
引用 9 楼 preferme 的回复:
自己写了一个。
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);
		}
	}


}
这个超级棒!
jige_hanhan 2013-10-24
  • 打赏
  • 举报
回复
在大家的帮助下, 我修改了代码并成功实现单向链表加数据。原因:递归本身就有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;
	}
	
	
	

}
冰思雨 2013-10-22
  • 打赏
  • 举报
回复
修改楼主的代码如下:
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 + "");
		}
	}

}
wind_elf 2013-10-22
  • 打赏
  • 举报
回复
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; } } }
冰思雨 2013-10-22
  • 打赏
  • 举报
回复
自己写了一个。
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);
		}
	}


}
寻找IT之路 2013-10-22
  • 打赏
  • 举报
回复
引用
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;
}

此处有问题 while(this.next!=null){
this.next.add(data); // 当i为2的时候,死循环是一直添加到root.next
}
teemai 2013-10-22
  • 打赏
  • 举报
回复

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;
    }
     
     
     
 
}
闲鱼野鹤-PJY 2013-10-22
  • 打赏
  • 举报
回复
引用 5 楼 zhuweisyyc 的回复:
最后this.next还是赋值了,还是跳不出循环啊
逻辑问题,换个思路吧,这个终止条件不合逻辑, 按你这逻辑的话,在while里要加上this.next=null; 试试吧
zhuweisyyc 2013-10-22
  • 打赏
  • 举报
回复
最后this.next还是赋值了,还是跳不出循环啊
jige_hanhan 2013-10-22
  • 打赏
  • 举报
回复
引用 1 楼 u010684923 的回复:
把if(this.next==null){ this.next = new Entry(data); } 这句放到while前面看看
同样的问题
jige_hanhan 2013-10-22
  • 打赏
  • 举报
回复
引用 2 楼 zhuweisyyc 的回复:
这个第二次add的时候Root的next不空不是死了吗 while(this.next!=null){                 this.next.add(data);             }
这个是递归调用,while里面的this.next.add(data),执行后,在第二次调用递归时,this就变成了,上一层的this.next了。
zhuweisyyc 2013-10-22
  • 打赏
  • 举报
回复
这个第二次add的时候Root的next不空不是死了吗 while(this.next!=null){                 this.next.add(data);             }
闲鱼野鹤-PJY 2013-10-22
  • 打赏
  • 举报
回复
把if(this.next==null){ this.next = new Entry(data); } 这句放到while前面看看

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧