import java.util.concurrent.ExecutionException;
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
Unit u1 = new Unit("A",1,null);
Unit u2 = new Unit("B",2,null);
Unit u3 = new Unit("C",3,null);
Unit u4 = new Unit("D",4,null);
u1.setNextUnit(u2);
u2.setNextUnit(u3);
u3.setNextUnit(u4);
reverse(u1);
System.out.println(u4);
}
/*
递归反转链表数据
* 执行步骤:
* 1.第一次进方法,参数为A1,再次调用方法传参B2,第一次阻塞等待返回值
* 2.第二次进方法,参数为B2,再次调用方法传参C3,第二次阻塞等待返回值
* 3.第三次进方法,参数为C3,再次调用方法传参D4,第三次阻塞等待返回值
* 4.第四次进方法,参数为D4,满足条件,进if,return D4
* 5.第三次的的阻塞获得了D4返回值,继续执行,直到最后一行,return了C3
* 6.第二次的方法获得了C3的返回值,继续执行,直到最后一行,return了B2
* 6.第一次的方法获得了B2的返回值,继续执行,直到最后一行,设置了A1的nextUnit为null,此时返回值无意义
* */
public static Unit reverse(Unit headUnit){
if(headUnit.getNextUnit()==null){
return headUnit;
}
Unit newUnit = reverse(headUnit.getNextUnit());
//下面的代码会等方法执行完在执行
newUnit.setNextUnit(headUnit);
headUnit.setNextUnit(null);
return headUnit;
}
//链表结构的一个存储单元
static class Unit{
//存储单元名称,多余的,可不要
private String name;
//存储数据
private Object data;
//指向下一个数据的指针
private Unit nextUnit;
public Unit(Object data, Unit nextUnit) {
this.data = data;
this.nextUnit = nextUnit;
}
public Unit(String name, Object data, Unit nextUnit) {
this.name = name;
this.data = data;
this.nextUnit = nextUnit;
}
public Unit getNextUnit() {
return nextUnit;
}
public void setNextUnit(Unit nextUnit) {
this.nextUnit = nextUnit;
}
@Override
public String toString() {
String nextUnitToString = null==this.nextUnit?"":this.nextUnit.toString();
String nextName = null==this.nextUnit?"null":this.nextUnit.name;
return "["+this.data+"|"+nextName+"]\t"+nextUnitToString;
}
}
}
java模拟链表并实现链表数据反转
最新推荐文章于 2021-03-05 02:21:47 发布