• 算法练习-第一天(反转链表)


    不要再因为那些你不能控制的事情有压力了,要专注于你能控制的事情
    文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

    👏👏👏
    哈喽!大家好,首先将我的刷题神器分享出来,点此注册
    😍😍😍

    在这里插入图片描述


    前言

    对于程序员来说算法属于基本功,掌握了算法就能够写出更高效的代码,所以一个好的练习算法的网站尤为重要,现在分享一下我经常刷算法题的网站,上面不仅有算法题,还有其他类型的题,赶紧刷起来吧,算法神器

    一、反转链表

    在这里插入图片描述

    二、题解

    import java.util.Stack;
    public class Solution {
    public ListNode ReverseList(ListNode head) {
        //新链表
        ListNode newHead = null;
        while (head != null) {
            //先保存访问的节点的下一个节点,保存起来
            //留着下一步访问的
            ListNode temp = head.next;
            //每次访问的原链表节点都会成为新链表的头结点,
            //其实就是把新链表挂到访问的原链表节点的
            //后面就行了
            head.next = newHead;
            //更新新链表
            newHead = head;
            //重新赋值,继续访问
            head = temp;
        }
        //返回新链表
        return newHead;
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    三、分析

    1、解决方式(双链表

    这里给出双链表的解决方式,也是较为简单方便的一种方式,就是将原来的链表放入到另外一个链表中。

    这里我用画图的方式来分析每一行代码分别操作了什么。

    1、首先我们先创建一个三个长度的链表,如下图:

    在这里插入图片描述

    这里相当于我们代码中传入的head,这个时候head是指向链表第一个元素的地址,这里“001”、“002”、“003”就是计算机中的存储地址,这里我们可以看到“001”地址里的元素的next指向的是“002”地址,然后“002”中的元素的next指向的是“003”地址,“003”地址的元素next指向的是“null”,代表到“003”地址这里这个链表就结束了。

    这个时候head其实就是指向“001”地址。

    在这里插入图片描述

    2、然后是下一段代码

     //新链表
        ListNode newHead = null;
    
    • 1
    • 2

    这里相当于新建一个newHead指向“null”。如下图所示:

    在这里插入图片描述

    3、然后是下一段代码。

      //先保存访问的节点的下一个节点,保存起来
            //留着下一步访问的
            ListNode temp = head.next;
    
    • 1
    • 2
    • 3

    这里相当于新建一个temp用来指向head的下一个节点的位置。如图所示。

    在这里插入图片描述
    4、然后是下一段代码。

     //每次访问的原链表节点都会成为新链表的头结点,
            //其实就是把新链表挂到访问的原链表节点的
            //后面就行了
            head.next = newHead;
    
    • 1
    • 2
    • 3
    • 4

    这里是将head的next指向newHead的位置,因为这个时候newHead是“null”,所以head位置的元素的next指向的值就由原来的“002”变为现在的“null”,如下图所示。

    在这里插入图片描述
    5、接下来是这段代码。

     //更新新链表
            newHead = head;
    
    • 1
    • 2

    这里就是将newHead指向head的位置,因为head指向的是“001”的地址,所以现在newHead从原来指向“null”值变为指向“001”的位置。如下图所示:

    在这里插入图片描述
    6、接下来是这段代码。

     //重新赋值,继续访问
            head = temp;
    
    • 1
    • 2

    这里将head指向temp的位置,如下图所示:

    在这里插入图片描述

    7、接下来又开始走while循环,判断head是否等于空,这里可以看到,head不为空,所以进入循环重复上面的代码,然后走第一段代码:

    //先保存访问的节点的下一个节点,保存起来
            //留着下一步访问的
            ListNode temp = head.next;
    
    • 1
    • 2
    • 3

    这个时候就是将temp指向head的next的位置,所以这里temp指向“003”的位置,如下图所示:

    在这里插入图片描述
    8、然后走下面这一段代码:

    //每次访问的原链表节点都会成为新链表的头结点,
            //其实就是把新链表挂到访问的原链表节点的
            //后面就行了
            head.next = newHead;
    
    • 1
    • 2
    • 3
    • 4

    这里将head的next指向newHead的位置,就是将head的next从原来的“003”指向现在newHead指向的“001”位置,如下图所示:

    在这里插入图片描述

    9、然后走下面这段代码:

     //更新新链表
            newHead = head;
    
    • 1
    • 2

    这里将newHead指向head的位置,就是将newHead从原来的“001”位置变为目前的“002”位置,结果如下图所示:

    在这里插入图片描述
    10、然后走下面这段代码:

       //重新赋值,继续访问
            head = temp;
    
    • 1
    • 2

    这里将head指向temp指向的位置,结果如下图所示:

    在这里插入图片描述

    11、然后再次进行循环判断,这个时候head指向的位置还有数据,所以再次进入循环中,执行下面的代码:

     //先保存访问的节点的下一个节点,保存起来
            //留着下一步访问的
            ListNode temp = head.next;
    
    • 1
    • 2
    • 3

    这里将temp指向head的next位置,因为这个时候head的next指向的是“null”,所以temp这里指向的也是“null”,结果如下图所示:

    在这里插入图片描述

    12、然后执行如下代码:

    //每次访问的原链表节点都会成为新链表的头结点,
            //其实就是把新链表挂到访问的原链表节点的
            //后面就行了
            head.next = newHead;
    
    • 1
    • 2
    • 3
    • 4

    这里将head.next指向newHead的位置,就是将原来head的next的“null”变为“002”,结果如下图所示:
    在这里插入图片描述
    13、然后执行下面这段代码:

     //更新新链表
            newHead = head;
    
    • 1
    • 2

    这里使newHead指向head,结果如下图所示:
    在这里插入图片描述
    14、然后执行下面这段代码:

    //重新赋值,继续访问
            head = temp;
    
    • 1
    • 2

    这里将head指向temp,因为这是temp指向的是“null”,所以这里head也指向null,结果如下图所示:

    在这里插入图片描述
    15、这个时候又开始循环判断,但是这个时候head就是“null”了,这个时候就可以将newHead输出了,可以看出这个时候这个链表已经反转了。

    2、测试提交

    代码写完了就需要先自测一下,这个时候我们点击自测运行看一看能不能测试通过。

    在这里插入图片描述
    这里我们可以看到自测成功了,那我们就点击保存并提交来提交此题。

    在这里插入图片描述
    提交答案后会显示我们此题的运行时间以及占用内存,并且判断我们这两项超过了其他百分之多少的人,我们还可以点击进入下一题来接着进行刷题,这样会越刷越上瘾的。

    四、总结

    通过这个刷题神器刷题是真的过瘾,通过画图的方式将每一行代码分析出来就不会觉得代码难以理解了,所以赶紧刷起来吧,点此注册

    可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模板,回复【学习路线图】获取学习路线图。

  • 相关阅读:
    15 分钟带你感受 CSS :has() 选择器的强大
    【NVMe2.0b 14-8】Set Features(下篇)
    工厂人员着装识别检测
    天空卫士C++ 一面(技术面、61min)
    数学建模| 优化入门+多目标规划
    线程池源码解析 1.前导_FutureTask源码解析
    C++ STL的空间配置器
    绝了,没有程序员追不到的女友?
    后端的datetime类型数据转为string作为(vue)前端的时间YYYY-MM-DD HH:mm:ss
    AUTOSAR-存储基础知识
  • 原文地址:https://blog.csdn.net/weixin_44096133/article/details/126445432