【刷题】【力扣牛客】反转链表的五种方式——Java

文章目录

  • 前言
  • 方法一:构造新链表(构造新节点)
  • 方法二:构造新链表(不构造新节点)
  • 方法三:递归
  • 方法四:双指针
  • 方法五:遍历
  • 总结


力扣题目链接:206. 反转链表
牛客题目链接:BM1 反转链表

前言

反转链表作为链表操作的基础是重中之重,以后做比较难的链表题目也可能会需要嵌入反转链表的代码,所以一定要多多练习


方法一:构造新链表(构造新节点)

思路:构造一个新的链表,从旧链表依次拿到每个节点,根据旧链表创建新节点添加至新链表头部,完成后新链表是倒序的

public ListNode reverseList (ListNode head) {//新链表的头节点,还没有元素,定义为nullListNode n1 = null;  //设置一个指针,用来遍历旧链表ListNode p = head;//循环遍历旧链表while(p != null){//根据旧链表的值创建新节点,把新节点的next指针设置为新链表的头节点,并更新新链表的头节点n1 =  new ListNode(p.val,n1);p = p.next;}//返回新链表的头节点return n1;
}

方法二:构造新链表(不构造新节点)

与方法一类似,构造一个新链表,从旧链表头部移除节点,添加到新链表头部,完成后新链表是倒序的————是不是看完后很蒙,和方法一一样啊,方法一是根据旧链表的值构造节点,方法二是直接使用旧链表的节点,没有创建新的节点

public ListNode reverseList (ListNode head) {ListNode p1 = head;ListNode p2 = null;while(true){//记录旧链表的头指针ListNode first = head;//如果旧链表的指针指向null就退出循环if(first == null){break;}//旧链表向前一步head = head.next;//将旧链表的头指针指向新链表的头first.next = p2;//更新新链表的头指针p2 = first;}return p2;
}

方法三:递归

递归,找到并返回最后一个节点记录为新节点,从倒数第二个开始,将后一个节点的指针指向自己(也就是p.next.next = p),再将自己的next指向null,避免死循环

public ListNode reverseList(ListNode head) {//递归结束条件和链表为空的条件判断if(head == null || head.next == null){return head;}//递归调用,当递归到最后一个节点时返回,也就是反转后的头节点,我们用变量记录下来ListNode newHead = reverseList(head.next);//从倒数第二个节点开始,将后一个节点的指针指向自己head.next.next = head;//将自己的next指针指向null,避免死循环head.next = null;//返回头节点return newHead;
}

方法四:双指针

双指针法:定义两个指针,都先指向头节点。将旧链表指针的下一个节点断开,插入到链表的头节点处,更新新链表的指针

    public ListNode reverseList(ListNode head) {//判断链表为空的情况if(head == null){return head;}//定义新链表指针ListNode n1 = head;//定义旧链表指针ListNode o1 = head;//判断条件,旧链表指针的下一个节点不为nullwhile(o1.next != null){//记录旧链表的下一个指针ListNode temp = o1.next;//跳过旧链表指针的下一个节点o1.next = o1.next.next;//将跳过的指针指向头temp.next = n1;//更新新链表的指针n1 = temp;}return n1;}

方法五:遍历

遍历法,定义三个指针,从前向后遍历一遍并更改指针的指向

    public ListNode reverseList(ListNode head) {//前指针ListNode prev = null;//当前指针ListNode p = head;//后一个指针ListNode next = null;while(p != null){//后一个指针,为什么要在循环里面赋值呢?避免head为null的情况next = p.next;//将当前指针指向前一个p.next = prev;//更新前指针prev = p;//更新当前指针p = next;}//这里为什么要返回前指针,因为p在循环里面被更新为null,循环才不能进行,所以循环走完后prev的位置是头节点的位置return prev;}

总结

本文讲解了反转指针的五种方法,反转指针是链表操作中的基础,但是特别重要,大家快去练习把~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/195771.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IDEA2023找不到 Allow parallel run

我的idea版本:2023.1.4 第一步:点击Edit Configrations 第二步:点击Modify options 第三步:勾选Allow multiple instances 最后点击Apply应用一下 ok,问题解决!

SSM项目实战-登录验证成功并路由到首页面,Vue3+Vite+Axios+Element-Plus技术

1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/sysUser.js import request from "../util/request.js";export const login (…

Mysql日志

文章目录 1. 日志类型2. bin log2.1 写入机制2.2 binlog与redolog对比2.3 两阶段提交 3. 中继日志 1. 日志类型 这 6 类日志分别为: 慢查询日志: 记录所有执行时间超过long_query_time的所有查询,方便我们对查询进行优化。 通用查询日志&am…

在sCrypt网站上铭刻Ordinals

sCrypt发布了一个新的Ordinals铭刻工具,连接Panda Wallet后即可使用。你可以观看我们录制的视频教程,获得更多细节。 铭刻工具同时支持BSV主网(mainnet)和测试网(testnet),你可以在我们的官方网…

手写VUE后台管理系统8 - 配置404NotFound路由

设置404页面 配置路由404页面 配置路由 这里配置了两个路由,一个是主页,另外一个则匹配任意路由显示为404页面。因为只配置了两个路由,如果路径没有匹配到主页,则会被自动导向到404页面,这样就可以实现整站统一的404页…

「Linux」使用C语言制作简易Shell

💻文章目录 📄前言简易shell实现shell的概念系统环境变量shell的结构定义内建命令完整代码 📓总结 📄前言 对于很多学习后端的同学来讲,学习了C语言,发现除了能写出那个经典的“hello world”以外&#xff…

142873-41-4脂质过氧化抑制剂1-星戈瑞

142873-41-4脂质过氧化抑制剂1 英文名称:Lipid peroxidation inhibitor 1 中文名称:脂质过氧化抑制剂 化学名称:2,4,6,7-四甲基-2-[(4-苯基哌啶-1-基)甲基]-3H-1-苯并呋喃-5-胺 CAS:142873-41-4 外观:固体粉末 分…

D2822ML 用于便携式录音机和收音机作音频功率放大器。采用 DIP8 SOP8 封装形式

D2822ML 用于便携式录音机和收音机作音频功率放大器。采用 DIP8 SOP8 封装形式 特点: 电源电压降到 1.8V 时仍能正常工作交越失真小 静态电流小可作桥式或立体声式功放应用外围元件少通道分离度高 开机和关机无冲击噪声软限幅

RT-Thread 内存管理

在计算机系统中,通常存储空间可以分为两种:内部存储空间和外部存储空间。 内部存储空间通常访问速度比较快,能够按照变量地址随机访问,也就是我们通常所说的RAM(随机存储器),可以把它理解为电脑…

docker安装达梦数据库并挂在数据卷

离线包下载地址:请点击 1.在线下载 wget https://download.dameng.com/eco/dm8/dm8_20230808_rev197096_x86_rh6_64_single.tar2. 导入镜像 docker load -i dm8_20230808_rev197096_x86_rh6_64_single.tar3. 运行容器 docker run -d -p 5236:5236 --restartalwa…

微信公众号端在线客服系统源码 聊天记录云端实时保存 附带完整的搭建教程

随着社交媒体的普及,越来越多的用户通过微信公众号与企业进行沟通。因此,开发一款基于微信公众号的在线客服系统,可以帮助企业更好地服务用户,提高客户满意度。同时,为了解决聊天记录的存储和管理问题,我们…

【Python 训练营】N_17 冒泡排序

题目 列表L [3,2,5,6,1,3,8,1,9],冒泡排序实现从小到大排列。 分析 冒泡排序的基本思想是从序列的第一个元素开始,依次比较相邻的两个元素,如果它们的顺序错误就交换它们的位置,直到整个序列有序为止。具体步骤如下&#xff1…

如何看待华为宣称“纯鸿蒙”OS将不再兼容安卓应用 APK彻底再见?

如何看待华为宣称“纯鸿蒙”OS将不再兼容安卓应用 APK彻底再见? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「安卓开发资料从专业入门到高级教程工具包」,点个关注,…

2023.12.4 GIT的概念和组成

目录 1.git的介绍 2.git的历史 开发者:Linus Torvalds Linux的创始人 3.git和svn的对比 svn:集中式管理 git:分布式管理 4.git管理的组成结构 1.git的介绍 git是项目版本管理工具,能自动的将多个版本进行管理存储,类似于快照,多个人共享版本 git的诞生:分布式…

VIM中替换光标所在行文字内容

:s/old/new/g将光标所在行的所有的old字符替换为new字符 :n,$s/old/new/g 从第n行开始到文件尾,将每一行中的old字符替换为new字符

PyQt pdf格式保存

参考文章 pyqt5:利用QFileDialog从本地选择图片\文本文档显示到label、保存图片\label文本到本地(附代码)_pyqt5中qfiledialog.getopenfileurl-CSDN博客 txt文件的打开与保存 def openTextFile(self): # 选择文本文件上传fd,fp QFileDialog.getOpen…

springboot统一异常处理

在 Spring Boot 中,可以通过自定义异常处理器来实现统一的异常处理。 创建自定义异常类 首先,创建一个自定义的异常类,继承自 RuntimeException 或其子类。这个异常类可以用来表示应用程序中的特定异常情况。 public class CustomExceptio…

行为型剩余的模式

1.中介者模式 package com.jmj.pattern.mediator;public abstract class Mediator {public abstract void constact(String message,Person person); }package com.jmj.pattern.mediator;public class MediatorStructure extends Mediator{private HouseOwner houseOwner;priva…

华为云云绘本第一期:童话奇迹原来是你

点此进入官网,专家1对1:应用身份管理服务OneAccess_华为云IDaaS-华为云

赛捷CRM集成无需API开发:连接营销系统,优化电商用户运营和广告策略

赛捷CRM集成无需API开发:连接营销系统,优化电商用户运营和广告策略 在当前的电商热潮下,企业如何在竞争中脱颖而出,提高用户运营效率和广告策略的精准度,成为了关键性的挑战。赛捷CRM以其无需API开发的集成解决方案&a…