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

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


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

算法练习-第一天(反转链表)_第1张图片

文章目录

  • 前言
  • 一、反转链表
  • 二、题解
  • 三、分析
    • 1、解决方式(双链表)
    • 2、测试提交
  • 四、总结


前言

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

一、反转链表

算法练习-第一天(反转链表)_第2张图片

二、题解

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、解决方式(双链表)

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

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

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

算法练习-第一天(反转链表)_第3张图片

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

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

算法练习-第一天(反转链表)_第4张图片

2、然后是下一段代码

 //新链表
    ListNode newHead = null;

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

算法练习-第一天(反转链表)_第5张图片

3、然后是下一段代码。

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

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

算法练习-第一天(反转链表)_第6张图片
4、然后是下一段代码。

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

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

算法练习-第一天(反转链表)_第7张图片
5、接下来是这段代码。

 //更新新链表
        newHead = head;

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

算法练习-第一天(反转链表)_第8张图片
6、接下来是这段代码。

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

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

算法练习-第一天(反转链表)_第9张图片

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

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

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

算法练习-第一天(反转链表)_第10张图片
8、然后走下面这一段代码:

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

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

算法练习-第一天(反转链表)_第11张图片

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

 //更新新链表
        newHead = head;

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

算法练习-第一天(反转链表)_第12张图片
10、然后走下面这段代码:

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

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

算法练习-第一天(反转链表)_第13张图片

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

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

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

算法练习-第一天(反转链表)_第14张图片

12、然后执行如下代码:

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

这里将head.next指向newHead的位置,就是将原来head的next的“null”变为“002”,结果如下图所示:
算法练习-第一天(反转链表)_第15张图片
13、然后执行下面这段代码:

 //更新新链表
        newHead = head;

这里使newHead指向head,结果如下图所示:
算法练习-第一天(反转链表)_第16张图片
14、然后执行下面这段代码:

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

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

算法练习-第一天(反转链表)_第17张图片
15、这个时候又开始循环判断,但是这个时候head就是“null”了,这个时候就可以将newHead输出了,可以看出这个时候这个链表已经反转了。

2、测试提交

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

算法练习-第一天(反转链表)_第18张图片
这里我们可以看到自测成功了,那我们就点击保存并提交来提交此题。

算法练习-第一天(反转链表)_第19张图片
提交答案后会显示我们此题的运行时间以及占用内存,并且判断我们这两项超过了其他百分之多少的人,我们还可以点击进入下一题来接着进行刷题,这样会越刷越上瘾的。

四、总结

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

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

你可能感兴趣的:(刷题,算法,链表,java)