问题描述
有下面一段代码,请大家看看:是关于Link的,在这段代码中,定义了一个Link,在Link中有存数据的data变量,和指向下一个node的变量next.在加入所有数据“A,B,C,D,E"到link中后,link类的data保存的为何值?大家可以看到,调用print方法后,publicvoidprint(){System.out.print(this.data+"t");//输出节点内容if(this.next!=null){//还有下一个元素,需要继续输出this.next.print();//下一个节点继续调用print}}我用黄色标记出来了,this.data中的数据为root数据,之后依次读取接下来的数据。从此可以看出,每次用this.data的时候,this.data中的内容都是root中的内容。为什么呢?为什么用data中内容都是defaultroot中的内容呢?在使用到其他方法如contains,delete也是一样,this.data都是从root开始的,一个一个搜索下去的。为什么?classLink{//链表的完成类classNode{//保存每一个节点,此处为了方便直接定义成内部类privateStringdata;//保存节点的内容privateNodenext;//保存下一个节点publicNode(Stringdata){this.data=data;//通过构造方法设置节点内容}publicvoidadd(NodenewNode){//将节点加入到合适的位置if(this.next==null){//如果下一个节点为空,则把新节点设置在next的位置上this.next=newNode;}else{//如果不为空,则需要向下继续找nextthis.next.add(newNode);}}publicvoidprint(){System.out.print(this.data+"t");//输出节点内容if(this.next!=null){//还有下一个元素,需要继续输出this.next.print();//下一个节点继续调用print}}publicbooleansearch(Stringdata){//内部搜索的方法if(data.equals(this.data)){//判断输入的数据是否和当前节点的数据一致returntrue;}else{//向下继续判断if(this.next!=null){//下一个节点如果存在,则继续查找returnthis.next.search(data);//返回下一个的查询结果}else{returnfalse;//如果所有的节点都查询完之后,没有内容相等,则返回false}}}publicvoiddelete(Nodeprevious,Stringdata){if(data.equals(this.data)){//找到了匹配的节点previous.next=this.next;//空出当前的节点}else{if(this.next!=null){//还是存在下一个节点this.next.delete(this,data);//继续查找}}}};privateNoderoot;//链表中必然存在一个根节点publicvoidaddNode(Stringdata){//增加节点NodenewNode=newNode(data);//定义新的节点if(this.root==null){//没有根节点this.root=newNode;//将第一个节点设置成根节点}else{//不是根节点,放到最后一个节点之后this.root.add(newNode);//通过Node自动安排此节点放的位置}}publicvoidprintNode(){//输出全部的链表内容if(this.root!=null){//如果根元素不为空this.root.print();//调用Node类中的输出操作}}publicbooleancontains(Stringname){//判断元素是否存在returnthis.root.search(name);//调用Node类中的查找方法}publicvoiddeleteNode(Stringdata){//删除节点if(this.contains(data)){//判断节点是否存在//一定要判断此元素现在是不是根元素相等的if(this.root.data.equals(data)){//内容是根节点this.root=this.root.next;//修改根节点,将第一个节点设置成根节点}else{this.root.next.delete(root,data);//把下一个节点的前节点和数据一起传入进去}}}};publicclassLinkDemo02{publicstaticvoidmain(Stringargs[]){Linkl=newLink();l.addNode("A");//增加节点l.addNode("B");//增加节点l.addNode("C");//增加节点l.addNode("D");//增加节点l.addNode("E");//增加节点System.out.println("=======删除之前========");l.printNode();//System.out.println(l.contains("X"));l.deleteNode("C");//删除节点l.deleteNode("D");//删除节点l.deleteNode("A");//删除节点System.out.println("n======删除之后=========");l.printNode();System.out.println("n查询节点:"+l.contains("B"));}};
解决方案
解决方案二:
这里面有两个类,LZ要先明白其中的关系this.data这个是在Node类里,其中的this代表当前Node,当前的Node为root时,先打印root的data,然后继续递归调用this.next.print,此时会再次进入print方法,这时的this就不再是root了,是root的下一个Node,也就是之前的this.nextcontains,delete方法是在Link类里,该类需要一个root,所以开始时就定义一个变量privateNoderoot;//链表中必然存在一个根节点这样每次查找获删除时都是从该根节点开始