日期:2014-05-20  浏览次数:20784 次

求救:简单的单向链表,this.next.add(newNode)与add(this.next)的区别

class Link{ // 链表的完成类
class Node{ // 保存每一个节点,此处为了方便直接定义成内部类
private String data ; // 保存节点的内容
private Node next ; // 保存下一个节点
public Node(String data){
this.data = data ; // 通过构造方法设置节点内容
}
public void add(Node newNode){ // 将节点加入到合适的位置
if(this.next==null){ // 如果下一个节点为空,则把新节点设置在next的位置上
this.next = newNode ;
}else{ // 如果不为空,则需要向下继续找next
add(this.next) ;
//this.next.add(newNode);
}
}
public void print(){
System.out.print(this.data + "\t") ; // 输出节点内容
if(this.next!=null){ // 还有下一个元素,需要继续输出
this.next.print() ; // 下一个节点继续调用print
}
}
};
private Node root ; // 链表中必然存在一个根节点
public void addNode(String data){ // 增加节点
Node newNode = new Node(data) ; // 定义新的节点
if(this.root==null){ // 没有根节点
this.root = newNode ; // 将第一个节点设置成根节点
}else{ // 不是根节点,放到最后一个节点之后
this.root.add(newNode) ; // 通过Node自动安排此节点放的位置
}
}
public void printNode(){ // 输出全部的链表内容
if(this.root!=null){ // 如果根元素不为空
this.root.print() ; // 调用Node类中的输出操作
}
}
};
public class LinkDemo022{
public static void main(String args[]){
Link l = new Link() ;
l.addNode("A") ; // 增加节点
l.addNode("B") ; // 增加节点
l.addNode("C") ;
l.printNode() ;
}
};

增加结点,正确的应该写成:this.next.add(newNode),我写成add(this.next),导致的问题:
增加两结点可以,如果增加3个或3个以上就进入死循环了,我不清楚这两个有啥区别,为啥就进入死循环了?
求高手给我从根源上剖析一下,谢谢
------解决方案--------------------
不和lz谈语言,就和lz谈下阅读理解
                add(this.next) ;  //这个是把自己的后继结点加到自己的位置上
                this.next.add(newNode);  //这个是把newNode加到自己的后继节点的位置上
你说有啥区别?第一条语句连newNode都没了,你竟然敢说没区别~
------解决方案--------------------
add时是需要加到一个后继指针为空的节点后,首先需要找到这个节点,再进行add。
public void add(Node newNode){        // 将节点加入到合适的位置             if(this.next==null){            // 如果下一个节点为空,则把新节点设置在next的位置上                 this.next = newNode ;             }else{        // 如果不为空,则需要向下继续找next                 add(this.next) ;                 //this.next.add(newNode);             }         } 

楼主的add(this.next)始终是在把next节点加在自己的上,并没有去找到一个为空的节点。所以会有错误。