前言:单链表的逆置总是看完博客,当时懂了过一段时间就忘了,还是动手写一下加深一下印象吧。

参考博客:点击打开链接

demo地址:我的github

1. 单链表

先写一个简单的单链表,改写一下它的toString方法,打印出以该Node为head的单链表,方便调试。

package com.example.demo_24_chain_reversed;public class Node {public int value;public Node nextNode;public Node(int value) {this.value = value;}@Overridepublic String toString() {return this.value + "-->" + (nextNode != null ? nextNode.toString() : "null");}
}

2.单链表的递归逆置

先看下效果:

用专业的话来说就是:递归方法用的是栈的思想,先把头结点入栈,接着头结点的下一个结点入栈,直到尾结点位置,

接着依次把栈内的元素出栈,并更换其下一个结点对应的对象:

我个人理解就是一个单链表的逆置总是可以分解成一个head和它nextNode的逆置,只要head的nextNode逆置好了,然后再添上head就好了,这就用到了递归。上面我打印出的log也可以看出来。

3. 单链表的非递归逆置

非递归的方法其实就是顺着头结点往尾结点便利,遍历期间把每个结点的nextNode替换掉,
替换过程需要注意临时存储下一个节点

4.demo源码

package com.example.demo_24_chain_reversed;public class MyClass {public static void main(String[] args){Node a = new Node(1);Node b = new Node(2);Node c = new Node(3);Node d = new Node(4);a.nextNode = b;b.nextNode = c;c.nextNode = d;//reverseChainRecursive(a);reverseChainNotRecursive(a);}private static Node reverseChainRecursive(Node head){System.out.println("before "+ head);if(head == null || head.nextNode == null){System.out.println("after " + head);return head;}Node headOfReverseChain = reverseChainRecursive(head.nextNode);head.nextNode.nextNode = head;head.nextNode = null;System.out.println("after "+ headOfReverseChain);return headOfReverseChain;}private static Node reverseChainNotRecursive(Node head) {Node pre = head;Node cur = head.nextNode;Node tmp;// 头结点的nextNode应该要置空pre.nextNode = null;while (cur != null) {// 先存放nex结点tmp = cur.nextNode;// 修改next结点指向precur.nextNode = pre;System.out.println("not ready "+ tmp);System.out.println("already "+ cur);System.out.println("---------");pre = cur;cur = tmp;}return pre;}
}

(二十四) 单链表的逆置(java)相关推荐

  1. 无头结点单链表的逆置_解析单链表逆置的多种方法 | 术与道的分享

    单链表的逆置还是很重要的,不过第一次写逆置的时候程序就直接奔溃了,因为解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的,因此这也就成就了单链表在面试中的地位. 1.普通循环逆置 ...

  2. 试写一算法,对单链表进行逆置

    NOTICE: 本篇代码是按照源码的书写顺序所写,复制之后可直接运行. 环境: vscode 题目: 试写一算法,对单链表进行逆置 分析: 单链表的逆置需要设置两个指针,第一个进行遍历单链表:第二个进 ...

  3. C语言实现单链表的逆置

          单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决.       首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...

  4. 无头结点单链表的逆置_单链表的增删查 逆置 倒数第k个节点等问题

    对于单链表而言,它没有双链表那么复杂,它只有头节点,尾节点,节点数据,后继指针.在下面本人实现了 单链表的 增   删   插  查  改. #include #include #include #i ...

  5. 无头结点单链表的逆置_第1章第2节练习题11 就地逆置单链表

    ## 问题描述 > 试编写在带头结点的单链表就地逆置,所谓"就地"是指辅助空间为O(1) ## 算法思想1 > 将头结点摘下,然后从第一个结点开始,依次插入到头节点的后 ...

  6. 逆置单链表c语言程序,(数据结构C语言版)顺序表和单链表的逆置

    <(数据结构C语言版)顺序表和单链表的逆置>由会员分享,可在线阅读,更多相关<(数据结构C语言版)顺序表和单链表的逆置(7页珍藏版)>请在人人文库网上搜索. 1.实验1-1顺序 ...

  7. 有头结点单链表的逆置

    [问题描述] 设有头结点单链表,编写算法实现单链表逆置. [输入形式] 第一行输入一个整数N: 第二行输入N个整数,以空格作为分隔,创建单链表: [输出形式] 输出逆置后的单链表,,元素之间以空格分隔 ...

  8. 单链表的逆置-C++实现(ok)

    对于单链表的逆置有两种方法可以实现: (1)利用辅助指针 基本思想:在遍历结点过程中,设置辅助指针,用于记录先前遍历的结点.这样依次编译的过程中只需修改其后继结点的next域即可. 实现代码: [cp ...

  9. 头插法逆置单向链表c语言,单链表的逆置(头插法和就地逆置)

    今天课间的时候偶然看到了一个面试题:单链表的逆置,看了题解感觉乖乖的,貌似和以前看的版本不搭,于是重新进行了一番探究 单链表的逆置分为两种方法:头插法和就地逆置法,这两种方法虽然都能够达到逆置的效果, ...

最新文章

  1. Tomcat7目录结构详解(非常详细)
  2. HTML去掉列表前面的符号!
  3. 本地tomcat的start.bat启动时访问不出现小猫图标
  4. 一种业界通用的响应式布局解决方法
  5. sap相关性不能被编译_经典综述编译丨生物硝化抑制丨NAT PLANTS:现代农业中的氮转化和生物硝化抑制作用...
  6. JVM学习-垃圾回收基础
  7. 将coco数据集格式转变成voc数据格式
  8. 点击调试时提示MFC不包含调试信息
  9. PowerDesigner设置code和name不联动的方法
  10. Tensorflow2.0之FGSM
  11. CSDN刷访问量专用博客
  12. 朋友圈集赞神器 | 1秒集齐300个赞,从此点赞不求人
  13. Pseudo Labelling
  14. 服务器虚拟化实验报告,服务器虚拟化Hyper-v 3.0实训培训
  15. 龙芯Fedora21平台制作docker镜像,并且解决vi乱码问题
  16. POI EXCEL修改图表
  17. 后端技术交流群,邀你加入
  18. 诺基亚Symbian算不算智能手机?
  19. Locating UI Elements (WebElements)摘抄整理
  20. Open3D RANSAC算法拟合分割多条直线

热门文章

  1. WorkFusion智能文档处理IDP系统介绍
  2. 全自动过滤器:全自动叠片过滤器工作原理及应用范围
  3. [项目管理]关于风险管理的问题和可能过早的幼儿教育
  4. web接口测试之GET与POST请求
  5. xiuno开发文档_XiunoPHP4.0开发手册 | 雷雨博客
  6. 关于限流熔断Sentinel总结
  7. win10更新后任务栏卡死解决方法
  8. 电子传真文档怎样加盖印章
  9. HTML实现简单的网页设计。
  10. 删除后一页数据后,分页显示上一页数据