java 实现单链表逆转详解及实例代码
java实现单链表逆转详解
实例代码:
classNode{
Nodenext;
Stringname;
publicNode(Stringname){
this.name=name;
}
/**
*打印结点
*/
publicvoidshow(){
Nodetemp=this;
do{
System.out.print(temp+"->");
temp=temp.next;
}while(temp!=null);
System.out.println();
}
/**
*递归实现单链表反转,注意:单链表过长,会出现StackOverflowError
*@paramn
*@return
*/
publicstaticNoderecursionReverse(Noden){
longstart=System.currentTimeMillis();
if(n==null||n.next==null){
returnn;
}
NodereverseNode=recursionReverse(n.next);
n.next.next=n;
n.next=null;
System.out.println("递归逆置耗时:"+(System.currentTimeMillis()-start)+"ms...");
returnreverseNode;
}
/**
*循环实现单链表反转
*@paramn
*@return
*/
publicstaticNodeloopReverse(Noden){
longstart=System.currentTimeMillis();
if(n==null||n.next==null){
returnn;
}
Nodepre=n;
Nodecur=n.next;
Nodenext=null;
while(cur!=null){
next=cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
n.next=null;
n=pre;
System.out.println("循环逆置耗时:"+(System.currentTimeMillis()-start)+"ms...");
returnpre;
}
@Override
publicStringtoString(){
returnname;
}
publicstaticvoidmain(String[]args){
intlen=10;
Node[]nodes=newNode[len];
for(inti=0;i<len;i++){
nodes[i]=newNode(i+"");
}
for(inti=0;i<len-1;i++){
nodes[i].next=nodes[i+1];
}
/*try{
Thread.sleep(120000);
}catch(InterruptedExceptione){
e.printStackTrace();
}*/
Noder1=Node.loopReverse(nodes[0]);
r1.show();
Noder=Node.recursionReverse(r1);
r.show();
}
}
总结
对于递归和循环,推荐使用循环实现,递归在单链表过大时,会出现StatckOverflowError,递归涉及到方法的调用,在性能上也弱于循环的实现
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!