请问下这个递归单链表倒叙具体的过程

ooesb 2016-06-02 03:49:42

public Node reverse(Node first)
{
if(first == null) return null;
if(first.next == null) return first;
Node second = first.next;
Node rest = reverse(second);
second.next = first;
first.next = null;
return rest;
}

标红这段代码具体怎么运行到最后的。没看很懂。
是从第N个开始向前面调换位子吗。
Node rest = reverse(second);
像这样
Node rest = reverse(2);
Node rest = reverse(3);

Node rest = reverse(last);
是会从链表最后一个元素开始返回值吗直到第一个吗。
second.next = first;
first.next = null;
return rest;
...全文
154 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
ooesb 2016-06-12
  • 打赏
  • 举报
回复
引用 9 楼 u010087908 的回复:
[quote=引用 6 楼 luciferisnotsatan 的回复:] [quote=引用 5 楼 u010087908 的回复:] 你自己实际操作一下不就明白了么? 试一下3个节点的 再试一下5个节点的。
赵老湿把alpha娜教坏了[/quote] 不对么?[/quote] 这是书上的程序,结果应该也不会错呐。可是不懂得为什么每次都要return rest;
ooesb 2016-06-03
  • 打赏
  • 举报
回复
输出结果: 1-->2-->3-->4-->5-->6-->7-->8-->9-->10 10-->9-->8-->7-->6-->5-->4-->3-->2-->1
ooesb 2016-06-03
  • 打赏
  • 举报
回复
测试程序引用chen_yongkai的回答。 public class TestLink { static final class Node { final int value; Node next; public Node(int value) { super(); this.value = value; } public void next(Node node) { this.next = node; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ @Override public String toString() { String s = String.valueOf(value); if (next != null) { s += "-->" + next.toString(); } return s; } } public static void main(String[] args) { int size=10; Node root = new Node(1); Node n = root; for (int i = 2; i <= size; i++) { Node m = new Node(i); n.next = m; n = m; } System.out.println(root); System.out.println(reverse(root)); } public static Node reverse(Node first) { if (first == null) return null; if (first.next == null) return first; Node second = first.next; Node rest = reverse(second); second.next = first; first.next = null; return rest; } }
luciferisnotsatan 2016-06-03
  • 打赏
  • 举报
回复
引用 5 楼 u010087908 的回复:
你自己实际操作一下不就明白了么? 试一下3个节点的 再试一下5个节点的。
赵老湿把alpha娜教坏了
NANU-NANA 2016-06-03
  • 打赏
  • 举报
回复
引用 6 楼 luciferisnotsatan 的回复:
[quote=引用 5 楼 u010087908 的回复:] 你自己实际操作一下不就明白了么? 试一下3个节点的 再试一下5个节点的。
赵老湿把alpha娜教坏了[/quote] 不对么?
NANU-NANA 2016-06-02
  • 打赏
  • 举报
回复
你自己实际操作一下不就明白了么? 试一下3个节点的 再试一下5个节点的。
luciferisnotsatan 2016-06-02
  • 打赏
  • 举报
回复
最后一个时,调用reverse,就进了if(first.next == null) return first;这句 然后Node rest = reverse(second); rest就是最后一个, second.next = first; 这样最后一个的(second)下一个就是倒数第二个(first)。 return rest;返回最后一个 此后就是倒数第二个的next连倒数第三,返回最后一个。最终你就有了个倒转的链表,表头就是一路return回来的rest(原倒数第一)。
姓小名白丶 2016-06-02
  • 打赏
  • 举报
回复
不懂帮顶。。。。。
把分全给哥 2016-06-02
  • 打赏
  • 举报
回复
引用 1 楼 So__Sick 的回复:
什么东西?看不懂!
一定要有耐心
紫菜丶 2016-06-02
  • 打赏
  • 举报
回复
什么东西?看不懂!
代码下载链接: https://pan.quark.cn/s/a4b39357ea24 用户账户控制(UAC)白名单的配置 Windows7环境中 UAC(User Account Control,用户帐户控制)是由微软在Windows Vista版本中推出的一项旨在增强系统安全性的创新技术,该技术强制要求用户在执行可能干扰计算机正常运作的操作或进行更改会波及其他用户设置的变动前,必须提供相应的权限或管理员密码进行验证。通过对这些操作启动前进行授权确认,UAC能够有效阻止恶意软件及间谍软件在未获授权的状态下于计算机内进行安装或实施修改。 自从Vista版本问世以来,微软便开始推行这一全新的安全机制,可视为对系统安全防护的显著提升。尽管UAC确实能够在一定程度上对某些非法程序起到防御作用,但与此同时,这一功能也给众多用户带来了诸多不便。 因此,许多用户开始探寻是否存在类似于白名单的功能,以便将那些值得信赖的程序直接赋予运行权限。事实上,这类功能确实存在,不过微软并未将其作为标准配置提供。 网络上关于此问题的绝大多数建议都是建议禁用UAC,这种说法显然缺乏针对性,因为若用户希望禁用此功能,本就不会提出相关疑问。 通过运用微软官方发布的Microsoft Application Compatibility Toolkit 5.6版本,可以将信任的程序纳入系统白名单范畴。 获取Application Compatibility Toolkit 安装程序成功后会出现三个可执行文件 以管理员身份启动Compatibility Administrator 在Custom DataBases部分创建新的数据库,并添加一个Application Fix(在下方空白处点击右键,选择...

703

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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