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

举报
小奇JAVA 发表于 2022/08/24 00:57:11 2022/08/24
【摘要】 不要再因为那些你不能控制的事情有压力了,要专注于你能控制的事情 文章持续更新,可以微信搜索【小奇JAVA面试】第一时间阅读,回复【资料】获取福利,回复【项目】获取项目源码,回复【简历模板】获取简历模...

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

文章来源: xiaoqijava.blog.csdn.net,作者:旷世奇才李先生,版权归原作者所有,如需转载,请联系作者。

原文链接:xiaoqijava.blog.csdn.net/article/details/126445432

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。