您的位置:首页 > 其它

单链表的逆序实现,递归和非递归算法

2014-03-20 20:39 274 查看
这个也是很常见的面试题目。

刚开始见过,开了一下别人写的以为理解了,让我自己写,我才发现原来里面的细节是很多的,可以说,你也许大概懂算法在干什么,可是,你若如果不注意细节,根本体会不到算法里面的每一行的意思,今天就是看了别人一个算法,被误导了,怎么都没理解他的意思。结果看了10几篇,果然他里面漏了点东西,引导我越陷月深,所以,非要弄清楚,看了好多人写的东西。

我只能说都大致相同,可是有很多细节都没注意到,一看就是粘贴过来的,里面的没思考。为了不误导大家,这里贴下两种算法。

非递归算法,你只要理解整个过程怎么一个一个断开,一个一个链接起来的,就还算法容易理解

而递归算法,我只能说,你不画一个递归树图,你根本反应不过来在干什么,我也是看了很多人写的,内容,图解分析才明白的。如下:

class Test4{
class Node{
int value;
Node next;
}
Node reverse(Node head){
if(head==null||head.next==null)return head;
Node p1,p2,p3;
p1=head;
p2=head.next;
head.next=null;
while(p2!=null){
p3=p2.next;
p2.next=p1;
p1=p2;
p2=p3;
}
return p2;
}
Node reverseWithRecursive(Node head){
if(head==null||head.next==null)return head;
Node p,q;
p=head.next;
q=reverseWithRecursive(head.next);
p.next=head;
head.next=null;
return q;
}
}


简单补充几句,非递归

p1记录当前节点的前一个节点上是什么?

p2就是当前节点,最后一个节点,也就是最后逆序以后的头结点。

p3结点用来保存p2结点的下一个节点关系的中间变量。

大概过程就是,断开后面的节点,连接到前面,直到最后一个,他的最后为null,就返回了。

注意对于head头结点的处理,直接让他的next为null了,这里最好有个图,就更能很好的理解了。

递归

对于递归真的比较巧妙了,递归的思想。

别问我啥是递归的思想

利用2个节点p,q(之前一直没明白p是个什么的?)

p其实记录的就是第一个节点的信息,q则就是递归以后的最后一个节点。

这里要处理head结点,为什么?自己思考

第一个节点p要反链接到head头结点上面

最后处理head结点为null

如果,你真的明白这个过程,那么递归就理解的比较深入了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: