如何反转一个单链表java

2023-11-06

目标:

反转前
1 -->2–>3–>4

反转后
4–>3–>2–>1

思维

思维关键点
1 关键点一,本质
在这里插入图片描述

两两相邻的节点,的指向变反了而已。
清晰的抓本质,箭头方向的改变,这样才能写出简单代码!

2 关键点二 指针工具
做算法,指针工具的巧妙借用,本题至少pre current next 三个变量的指针用的上,试想反转一个指针,一定是存在两个节点,才能有个指向链吧!
current pre: 假设已知当前节点(current),那么就要考虑,指向当前节点的前一个节点pre。
next: 当current 的指针方向反转了,那么就访问不到从前旧的 next 指针了,所以需要提前在 指针反转前 取出,下一个循环要反转的节点

代码

public class ReverSingleLink {
    public static void main(String[] args) {
        ListNode listNode4 = new ListNode(4);
        ListNode listNode3 = new ListNode(3, listNode4);
        ListNode listNode2 = new ListNode(2, listNode3);
        ListNode listNode1 = new ListNode(1, listNode2);
        ListNode head = listNode1;

        System.out.println("反转前");
        pLink(head);

        //反正方法
        head = reverLink(head);


        System.out.println("反转后");
        pLink(head);

    }

    private static ListNode reverLink(ListNode head) {
        ListNode pre = null;//虚拟一个节点,在每次反转的wile循环中,下一个元素要将指针指向前一个元素
        ListNode current = head;
        ListNode next;

        while (current != null) {
            //保存下一次需要遍历的 元素
            next = current.next;
            //闭眼体会  = 他是一个方向的箭头,箭头的方向从左向右指向 " ---> ",此时不同于我平时理解的右边赋值给左边!!
            //本质修改了指针的方向!!!
            current.next = pre;
            //做好偏移量为下一圈循环做准备
            pre = current;
            current = next;
        }
        return pre;

    }

    private static void pLink(ListNode head) {
        while (head != null) {
            System.out.println(head.val);
            head = head.next;
        }
    }



    static class ListNode {
        public int val;
        public ListNode next;

        public ListNode() {
        }

        public ListNode(int val) {
            this.val = val;
        }

        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何反转一个单链表java 的相关文章

随机推荐

  • 全国哀悼日,网站变黑白完美兼容IE,亲测有效

    首先在你的页面头部 里面加入如下代码 不加的话IE11就嗝屁了 然后在css文件里加入如下代码 body webkit filter grayscale 100 html webkit filter grayscale 100 moz fi
  • c++给出一个百分制成绩,输出等级‘A‘,‘B‘,‘C‘,‘D‘,‘E‘

    include
  • 利用Maven把项目生成jar包供其他项目使用

    每当搭建框架时 第一步就是为系统整理一个接一个的jar包 用多了就开始深思 如何把自己的项目也整成jar包 供他人使用呢 近期一直在看徐晓斌所著 Maven实战 因自己学识不够 只是简单理解了一些 但也受益颇深 下面介绍如何利用Maven把
  • 对区块链技术的一些新思考

    作者 朱金灿 来源 clever101的专栏 为什么大多数人学不会人工智能编程 gt gt gt 缘起 上周写了一篇 对区块链技术的一些思考 之后和一些朋友进行了交流 纠正了我之前的一些关于区块链的错误认识 重新认识区块链 在之前的文章中我
  • AngularJS的增删改查、state嵌套案例,不涉及服务端

    本篇实践一个案例 大致是 左边有导航菜单 右边显示列表 并可对列表项编辑或删除 也可添加新的列表项 借此 可体会到 如何组织可扩展的AngualrJS文件结构 如何点击左侧菜单项右侧显示相应内容 angular ui router的使用以及
  • zgrep查看前后几行日志

    zgrep C 10 a 关键字 error log 2021 09 02 tar gz C注意大写 标识前后10行的意思
  • 如何利用AJAX技术提高网站搜索引擎排名(4)

    四 使用XmlHttpRequest 如果你的用户主要使用Internet Explorer的较新版本或基于Gecko的浏览器 Mozilla Firefox Netscape 7 那么你可以决定使用XmlHttpRequest对象来把其它
  • 阴影LightMode = ShadowCaster

    阴影 实现原理 使用Shadow Map技术 把摄像机与光源位置重合 光源的阴影部分就是摄像机看不到的地方 前向渲染路径中 最重要的平行光如果开启了阴影 Unity就会为光源计算阴影映射纹理 shadowmap 本质就是深度图 记录光源出发
  • Android Studio出现:Your project path contains non-ASCII characters.

    公司设备需要自己开发安卓软件 我这就想自己研究下 开始想用IDEA 因为本身搞Java 后一番蒸腾没成功 在同事建议下装了Android Studio 4 X 一路跟着视频配置挺顺 没想到在创建项目上那里翻车了 如下图 自己没截图 用的别人
  • BitLocker自动解锁的密钥保存在哪里?

    当使用BitLocker加密Windows操作系统的系统分区时 可以选择让操作系统自动解锁系统盘 这通常需要将加密密钥保存在计算机上 以便系统能够自动解密系统盘并启动操作系统 在这种情况下 BitLocker会将密钥存储在计算机的TPM芯片
  • CUDA和C++混合编程及CMakeLists.txt

    1 概要 首先认识一个问题 单从CMakeLists txt的角度来看 无法同时使用两种编译器编译两种语言 不过直接编写Makefile是可以的 通过设置不同的任务 可以实现一个Makefile编译两个语言 但这不是这里要讨论的重点 使用C
  • Mybatis的$和#的区别

    1 是将传入的值当做字符串的形式 eg select id name age from student where id id 当前端把id值1 传入到后台的时候 就相当于 select id name age from student w
  • 在BIOS中开启虚拟化技术

    电脑不能在虚拟机中安装操作系统时 需要在BIOS中开启虚拟化技术 什么是BIOS BIOS 是一个内置于个人计算机的程序 当您打开计算机时该程序启动操作系统 也称为系统固件 BIOS 是计算机硬件的一部分 不同于 Windows 如何进入B
  • PCL1.8.0+VS2013环境配置

    一 PCL环境配置 1 下载PCL 1 8 0 AllInOne msvc2013 win32exe和PCL 1 8 0 AllInOne msvc2013 win32exe pdb然后解压 配置环境变量PATH 下载链接 https pa
  • Windows 11最新版:任务管理器性能参数详解,什么是分页缓冲池和句柄

    首先 可以确定的一点是 大部分电脑都至少有一个CPU 内存 硬盘 网卡 显卡 Win11的任务管理器和Win10的任务管理器除了UI不同外 参数显示上是几乎一样的 所以Win10的用户也可以参考一下 CPU 通常 任务管理器的性能页面中 C
  • java JVM - 垃圾回收机制

    垃圾的定义 只要对象不再被使用了 那我们就认为该对象就是垃圾 对象所占用的空间就可以被回收 怎么判断对象不再被使用的呢 常用的算法有两个 引用计数法 和 可达性分析法 引用计数法思路很简单 当对象被引用则 1 引用释放时计数则 1 当计数器
  • 推荐一款最强Python自动化神器!不用写一行代码!

    搞过自动化测试的小伙伴 相信都知道 在Web自动化测试中 有一款自动化测试神器工具 selenium 结合标准的WebDriver API来编写Python自动化脚本 可以实现解放双手 让脚本代替人工在Web浏览器上完成指定的操作 虽然se
  • vue实现点击按钮刷新页面的方法:

    1 简单方法 第一种 使用location对象的reload 方法 window location reload 第二种 使用编程式导航 this router go 0 2 使用vue中provide和inject 推荐 在app vue
  • YOLO技术概要学习笔记3——YOLOV4到YOLOV8

    目录 一 前言 二 YOLOv4 1 一个集成了 Bag of Specials BoS 的增强架构 2 集成了Bag of freebies BoF 的高级训练方法 3 自我对抗训练 SAT 4 遗传算法进行超参数优化 三 YOLOv5
  • 如何反转一个单链表java

    目标 反转前 1 gt 2 gt 3 gt 4 反转后 4 gt 3 gt 2 gt 1 思维 思维关键点 1 关键点一 本质 两两相邻的节点 的指向变反了而已 清晰的抓本质 箭头方向的改变 这样才能写出简单代码 2 关键点二 指针工具 做