救救我吧,这段代码看得我崩溃了

颠倒于java的彭先生 2020-03-23 10:52:19
public class TestDemo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Linkk lin = new Linkk () ;
lin.add("车厢1");
lin.add("车厢2");
lin.add("车厢3");
lin.add("车厢4");
System.out.println(lin.get(0));
}

}
class Linkk {
//-----------------------------
//封装一个内部类,操作每个节点关系
private class Node {
//定义节点储存的数据
private Object data ;
//定义节点关系
private Node next ;
//通过构造方法,为储存的数据赋值
public Node(Object data) {
this.data = data ;
}
//递归操作为外部每一次传入的数据依次放在节点上
public void chuCun (Node shuJu) {
//第一次执行时外部的root调用,传入的是第二次调用add方法的数据
if (this.next == null) {
this.next = shuJu ;
}
//如果this.next不为空,即前面的节点已经储存了数据,则递归调用,直到找到this.next为空的情况
else {
this.next.chuCun(shuJu);
}
}
//利用递归取得每个索引的数据
public Object getData(int index) {
//第一次调用是根节点数据调用
if (Linkk.this.foot ++ == index ) {
return this.data ;
}else {
//如果第一次即根节点的索引和传入的查找索引不匹配,就递归调用,继续往后查找,直到查找到或者没有
this.next.getData(index) ;
}//没有的话返回空
return null ;
}
}
//------------------------------
//设置根节点
private Node root ;
//设置链表长度
private int count = 0 ;
//为传入的每个节点数据设置角标
private int foot ;
//通过add方法传入要储存的数据
public void add (Object data) {
//实例化Node类的data属性,方便访问
Node shuJu = new Node (data) ;
//如果根节点上没储存数据,则把第一次外部调用传入的数据放在根节点上
if (this.root == null) {
this.root = shuJu ;
}
//为根节点储存数据后,为后面的节点储存数据,节点间的关系需要在Node类中有递归完成
else {
//根节点数据调用chuCun方法传入第二次传入的数据
this.root.chuCun(shuJu);
}
//每调用依次,链表的长度就加一次
this.count ++ ;
}
//建立取出指定索引的方法,依旧是根节点去利用递归调用
public Object get(int index) {
//传入的要查找的索引不能大于等于链表的长度
if (index >= this.count) {
return null ;
}else {
foot = 0 ;
return this.root.getData(index);
}
}
}



为什么
System.out.println(lin.get(0));
输出正常,而
System.out.println(lin.get(1));
传入的值是1以及更大的数组,全部输出都是null呢?


是我哪里写错了吗?

...全文
177 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Little5 2020-03-24
  • 打赏
  • 举报
回复
结贴
  • 打赏
  • 举报
回复
引用 1 楼 Little5 的回复:
你的逻辑错了。递归需要直接或者间接返回该函数本身。。你的逻辑里虽然递归调用了这个方法,但是没返回值啊。 不管你调用多少次,最后都会回到这句this.next.getData(index) ;你要返回这个值才算正确。但你只是调用了方法,没返回,所以就会执行下面那句多余的return null;然后不管你索引是多少,除了根节点,都是null。 建议递归的时候直接或者间接返回函数本身,避免逻辑错误。 很简单的逻辑。如果index匹配,则返回data。否则返回该函数本身,递归调用。
public Object getData(int index)
		{
			// index和当前节点foot匹配
			if (Linkk.this.foot++ == index)
			{
				return this.data;
			}

			return this.next.getData(index);
		}
大佬牛逼,一语点醒梦中人,递归递归,有递有归,我如果没有return修饰,相当于只递了,没归是吗?
Little5 2020-03-24
  • 打赏
  • 举报
回复
你的逻辑错了。递归需要直接或者间接返回该函数本身。。你的逻辑里虽然递归调用了这个方法,但是没返回值啊。 不管你调用多少次,最后都会回到这句this.next.getData(index) ;你要返回这个值才算正确。但你只是调用了方法,没返回,所以就会执行下面那句多余的return null;然后不管你索引是多少,除了根节点,都是null。 建议递归的时候直接或者间接返回函数本身,避免逻辑错误。 很简单的逻辑。如果index匹配,则返回data。否则返回该函数本身,递归调用。
public Object getData(int index)
		{
			// index和当前节点foot匹配
			if (Linkk.this.foot++ == index)
			{
				return this.data;
			}

			return this.next.getData(index);
		}

62,628

社区成员

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

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