首页 » PHP教程 » 反转链表php技巧_若何反转链表超具体图解看这一篇就够了

反转链表php技巧_若何反转链表超具体图解看这一篇就够了

duote123 2024-11-24 0

扫一扫用手机浏览

文章目录 [+]

哀求对链表进行反转,反转后的链表如下:

题目解析

反转链表,便是将链表中每一个节点的 next 引用指向其先驱节点。
链表默认自带一个引用,这个引用指向了头节点,记为 n1。
首先考试测验将 n1 的 next 引用进行反转:

反转链表php技巧_若何反转链表超具体图解看这一篇就够了

可以创造,① 的 next 引用指向了空,由于 ① 割断了指向 ② 的引用,导致 n1 无法移动到 ② 和 ③,此时可以再引入一个引用,记为 n2,n2 指向 ②:

反转链表php技巧_若何反转链表超具体图解看这一篇就够了
(图片来自网络侵删)

对 ② 进行反转:

这时候 ③ 丢失了,是否可以复用现有的引用来访问到 ③ 呢,答案是弗成的。
② 的先驱节点须要通过 n1 来访问,此时需再引入一个新的引用 n3,来指向 ③:

对 ③ 进行反转:

这时候三节点链表就完成了反转,题目到这是否就剖析结束了呢?再引入一个节点 ④,如图:

不难创造,④ 节点又丢失了。
再思考,能否复用现有引用,来访问到 ④,光从上图的结果来看,是弗成的,一旦一个节点完成了反转,其后继节点就丢失了,除非创建与链表节点数量同等的引用,每一个引用指向个中一个节点,然后按上述办法对每个节点完成反转。
这种办法显然不足优雅,那能否在反转下一个节点之前,先将引用后移,再反转呢?

接下来我们考试测验边反转,边移动引用。
通过上述剖析,反转链表至少要 3 个引用,可以得出移动的机遇是在反转 ③ 的时候,我们在反转 ③ 之前,先后移引用,担保不丢失 ④:

然后反转 ③:

我们须要指定一个引用,专门用来反转节点 next 指向。
显然指定中间引用 n2 是得当的,n1 指向着 n2 的先驱节点,n3 指向着 n2 的后继节点,这样可以既完成反转,又不会丢失后续的节点。
因此,我们在反转 ③ 之后,连续后移引用,使得 n2 指向 ④,完成对 ④ 的反转:

这里将移动和反转做了合并,可以看到,现在全体链表已经完成了反转。

代码实现

现在,我们只需将上述的剖析结果翻译成代码即可。
经由剖析可知,反转链表一共须要三个引用,为了清晰直不雅观,依次记为 prev、node、next,node 用于反转节点 next 指针。
每当完成一次反转,三个引用便整体向后移动一个节点。
代码实现如下:

public static Node reverse(Node node) { if (node == null || node.next == null) { return node; } Node prev = null; Node next = node.next; //next 指向空时,只需再进行末了一次反转 while (next != null) { //反转节点 node.next = prev; //引用后移 prev = node; node = next; next = next.next; } //反转末了一个节点 node.next = prev; //返回反转后的链表头引用 return node;}

须要把稳的是,当 next 引用指向空时,末端末了一个节点还未反转,以是在循环外要再反转一次。

其余,这里必须将处理好的 node 引用在方法中返回出去,通过拿方法的返回值来获取反转后的链表。
如果仍旧利用传入的 node,会创造 node 只剩下一个节点。
有如下测试代码:

//定义链表:1 -> 2 -> 3Node node = new Node(1);node.next = new Node(2);node.next.next = new Node(3);System.out.println("原始链表:");show(node);//反转链表Node rNode = reverse(node);System.out.println("反转后:");show(node);show(rNode);

结果如下:

原始链表:[Node{num=1, next=2}, Node{num=2, next=3}, Node{num=3, next=}]反转后:[Node{num=1, next=}][Node{num=3, next=2}, Node{num=2, next=1}, Node{num=1, next=}]

这是由于在 Java 中通报的是值,而不是引用。
反转后的图例如下:

在通报 node 时,是将 node 保存的内存地址复制了一份,传给了方法参数 node,方法中对 node 的移动,不会影响方法外的 node。

反转链表至此完成,在办理链表干系问题时,要时候把稳不能丢失节点,在修正节点 next 或者 prev 指针时,都要担保仍能访问到其他节点,如果创造无法复用现有引用,可以考试测验新增引用。
担保了这一点之后,剩下的便是按题目哀求实现即可。

标签:

相关文章

五一十字,传承红色基因,弘扬民族精神

五一十字,一个饱含红色基因的词汇,承载着中国人民为实现民族独立、人民解放、国家富强而不懈奋斗的历史记忆。如今,在全面建设社会主义现...

PHP教程 2024-12-27 阅读0 评论0

乐学网,开启智能教育新篇章

随着科技的飞速发展,人工智能在教育领域的应用日益广泛。作为国内领先的在线教育平台,乐学网凭借其先进的技术和优质的服务,为广大学习者...

PHP教程 2024-12-27 阅读0 评论0

绵阳IT产业,崛起中的西部硅谷

近年来,随着我国西部大开发战略的深入推进,绵阳市凭借其独特的区位优势、丰富的科教资源以及良好的产业基础,逐渐成为我国西部地区的IT...

PHP教程 2024-12-27 阅读0 评论0

网络直播的争吵,文明交流还是恶意宣泄

随着互联网的普及,网络直播成为了人们获取信息、娱乐休闲的重要途径。近年来,直播平台上的争吵事件频发,引发了社会各界的广泛关注。本文...

PHP教程 2024-12-27 阅读0 评论0

网管IT招聘,解码新时代技术人才的摇篮

随着互联网技术的飞速发展,我国IT行业迎来了前所未有的机遇。在这个技术变革的时代,网管IT人才的招聘成为各大企业争相追逐的热点。本...

PHP教程 2024-12-27 阅读0 评论0

主流编程语言介绍,技术发展的风向标

在信息技术飞速发展的今天,编程语言作为软件开发的基石,其重要性不言而喻。近年来,随着互联网、大数据、人工智能等领域的爆发式增长,主...

PHP教程 2024-12-27 阅读0 评论0