单链表递归反转算法疑问

passball 2011-02-20 06:11:39
node* reverse( node* pNode, node*& head)
{
if ( (pNode == 0) || (pNode->next == 0) ) // 递归跳出条件
{
head = pNode; // 将链表切断,否则会形成回环
return pNode;
}
node* temp = reserve(pNode->next, head);// 递归
temp->next = pNode;// 将下一节点置为当前节点,既前置节点
return pNode;// 返回当前节点
}


一直没弄明白这个算法,请问在这里pNode和head分别是指代哪个节点呢???在解释中有这样一句话“不过这个方法有一个缺点,就是在反转后的最后一个结点会形成一个环,所以必须将函数的返回的节点的next域置为NULL。因为要改变head指针,所以我用了引用。”。。。。。我想知道这个引用的作用是什么??

谁能帮我详细的注释一下这个程序啊,我实在是看不懂了。。。谢谢!!!
...全文
346 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
freud.wy 2011-02-23
  • 打赏
  • 举报
回复
算法执行的流程就是从最后一个节点向前依次把指针指向前一个节点,每一层返回给上一层最近被指向的节点。
passball 2011-02-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 asenpal 的回复:]
to 楼主
刚好今天也在想这个递归算法。。。
pNode是原表表头,head是反转后的表头,即原表的表尾。
你所说的引用,就是让参数head在反转后存储新的表头,其实不用引用也可以的
不过我有个疑问
temp->next = pNode
上面这句中,pNode不是表头指针吗,它可以自动进入下一层?我感觉应该加上类似pNode=pNode->next的语句吧
另外这个函数没法把原表头的……
[/Quote]


如果pNode还是指头的话,那它为什么要返回pNode而不返回head呢???
head = pNode;
return pNode;
asenpal 2011-02-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mailqiangwei 的回复:]
我也想知道是什么,请大人答复
[/Quote]

temp指针指向后继结点
pNode可以看作当前结点

明白这两点这个算法就很清楚了
asenpal 2011-02-20
  • 打赏
  • 举报
回复
哦丢人了,是可以自动进入下一层的。。。
asenpal 2011-02-20
  • 打赏
  • 举报
回复
to 楼主
刚好今天也在想这个递归算法。。。
pNode是原表表头,head是反转后的表头,即原表的表尾。
你所说的引用,就是让参数head在反转后存储新的表头,其实不用引用也可以的
不过我有个疑问
temp->next = pNode
上面这句中,pNode不是表头指针吗,它可以自动进入下一层?我感觉应该加上类似pNode=pNode->next的语句吧
另外这个函数没法把原表头的next指针设为NULL,需要单独处理
maoxing63570 2011-02-20
  • 打赏
  • 举报
回复
理解这些东西其实很简单,话个图,按照那个算法推一遍就知道了,简单给你说下吧。
首先从递归那里可以看出,如果以个链表不空的话,或者不是只有个一个节点的链表,那么链表就进行递归,一直找到最后一个节点并且返回它,那么temp就保存了最后一个节点的地址,在temp->next=pNode中,pNode保存的是倒数第二个节点的地址(如果你觉得不可以理解,你可以看下在递归中调用中pNode->next这句,进入下一轮递归后pNode->next才会为空(也就是最后一个节点)),然后执行temp->next=pNode,即让最后一个节点的下一个指向倒数第二个,指向递归下去,不就可以反向了。

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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