LeetCode反转链表的五种Java实现方式

news2024/10/6 8:33:31

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例 2:

输入:head = [1,2]
输出:[2,1]

示例 3:

输入:head = []
输出:[]

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

方法一

创建一个新链表,遍历旧链表中的数据并将其放入新链表的头部。实现方式如下

class Solution {
    public ListNode reverseList(ListNode head) {
        //创建一个新链表,将旧链表的头部放入新链表头部
        ListNode o1 = null;
        ListNode p = head;
        while(p!=null){
            o1=new ListNode(p.val,o1);
            p= p.next;
        }
        return o1;
    }
}

方法二

构造一个新链表,从旧链表头部移除节点,添加到新链表头部。与方法一的区别在于,没有新创建节点。

class Solution {
    public ListNode reverseList(ListNode head) {
        //旧节点
        Link o1 = new Link(head); 
        Link o2 = new Link(null);

        while(true){
            ListNode first = o1.removeFirst();
            if(first==null){
                break;
            }
            o2.addFirst(first);
        }
        return o2.head;
    }
    static class Link{
        private ListNode head;
        public Link(ListNode head){
            this.head = head;
        }
        //传入新链表
        public void addFirst(ListNode first){
            first.next=head;
            head=first;
        }

        public ListNode removeFirst(){
            ListNode first =head;
            if(first!=null){
                //说明还存在节点
                head = head.next;
            }
            return first;
        }
    }
}

方法三

采用递归思想,遍历到最后节点后,将最后一个节点指向上一个节点。

图示如下:

代码实现如下 

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null||head.next == null){
            return head;
        }
        //list作为头节点
        ListNode list = reverseList(head.next);
        //将当前节点作为list的最后一个节点
        head.next.next = head;
        //取消掉旧链表中的连接关系
        head.next =null;
        return list;
    }
}

方法四

从链表每次拿到第二个节点,将其从链表断开,插入头部,直至它为 null 结束

图示如下

代码实现如下 

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head==null || head.next==null){
            return head;
        }
        ListNode poniter = head.next;
        //用来充当头节点
        ListNode p = head;
        //不停的将第二个节点插入该链表的头部
        while(poniter!=null){
            //头节点指向第三个节点
            head.next = poniter.next;
            //第二个节点更改为头节点
            poniter.next = p;
            //将p指向当前链表的头部
            p = poniter;
            //pointer指向移动后原链表的第二个节点
            poniter = head.next;
        }
        return p;
    }
}

方法五

把链表分成两部分,思路就是不断从链表2的头,往链表1的头搬移

图示如下:

代码实现如下 

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null){
            return head;
        }
        ListNode p = null;
        while(head!=null){
            //第二个节点
            ListNode pointer  = head.next;
            head.next = p;
            p = head;
            head = pointer;
        }
        return p;
    }
}

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

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

相关文章

Mysql中的JDBC编程

JDBC编程 1.JDBC的数据库编程2.JDBC工作原理3.JDBC使用3.1JDBC开发案例3.2JDBC使用步骤总结 4.JDBC API4.1数据库连接Connection4.2 Statement对象4.3 ResultSet对象4.4 释放 5.Java代码操作数据库 1.JDBC的数据库编程 JDBC&#xff0c;即Java Database Connectivity&#xff0…

Java中生成指定字体的印章

文章目录 1.引入字体2.Windows环境下3. Linux环境下 生成印章测试类绘制方章测试类 1.引入字体 2.Windows环境下 如果在Windows上安装JAVA环境时&#xff0c;没有安装单独的jre1.8.0_141的话。那么字体就只放到\jdk1.8.0_141\jre\lib\fonts目前下。 3. Linux环境下 cat /etc…

11111

#include <iostream> #include <vector> #include <queue> #include <algorithm>using namespace std;// 边的结构体 struct Edge {int src, dest, weight;// 按照权重进行排序bool operator<(const Edge& other) const {return weight < ot…

win10资源管理器占用CPU过高导致卡顿

win10 打开几个文件夹后 资源管理器占用CPU 飙升&#xff0c;卡的很难受&#xff0c;网上找了几个办法 关闭 小娜&#xff0c;关闭搜索 什么的 都没明显改善&#xff0c;还有损招&#xff0c;重启资源管理器&#xff0c;重启一次 20多秒&#xff0c;要不了多长时间就会再次卡…

echarts实现不展示X轴Y轴轴线、刻度

今日工作中需要实现折线图的简图&#xff0c;就是只看个大概趋势不展示具体坐标&#xff0c;查阅了文档记录一下。 initCharts(_id, _name, yAxisData, _unit){if(this[_id]) this[_id].clear();this[_id] $echarts.init(document.getElementById(_id));const options {grid…

settings.json配置

settings.json配置 {"editor.tabSize": 2,"git.ignoreWindowsGit27Warning": true,"workbench.editor.untitled.hint": "hidden","security.workspace.trust.untrustedFiles": "open","[vue]": {"…

老师的保命大法

数字化高度发达的今天&#xff0c;成绩查询系统已经成为学校教育中不可或缺的一部分。不同于传统的成绩公布方式&#xff0c;成绩查询系统更加高效、便捷&#xff0c;同时也充分保障了每位学生的隐私&#xff0c;今天就来揭秘这个教师保命大法&#xff01; 1、代码查询法 对于…

docker内更新显卡cuda cudnn

当前docker使用的cuda为10.2&#xff0c;为保证服务器环境使用相同的cuda版本&#xff0c;需对cuda版本进行升级&#xff0c;时间长了忘记如何操作&#xff0c;此处记录一下&#xff1a; *docker内使用的cuda版本低于容器外的显卡驱动版本即可&#xff0c;此处不对显卡驱动进行…

HTML5学习系列之实用性标记

HTML5学习系列之实用性标记 前言实用性标记高亮显示进度刻度时间联系信息显示方向换行断点标注 总结 前言 学习记录 实用性标记 高亮显示 mark元素可以进行高亮显示。 <p><mark>我感冒了</mark></p>进度 progress指示某项任务的完成进度。 <p…

程序员兼职平台有哪些?这样写兼职简历让你收入直接飙升30k!

这是著名程序员兼职平台 “猿急送”的分享资料&#xff0c;猿急送2015年成立&#xff0c;国内最早最领先的程序员兼职平台&#xff0c;今天跟大家继续讲一下在程序员兼职平台里接单的一个重要问题&#xff1a;怎样写好个人兼职简历&#xff1f;&#xff08;想直接看主流程序员兼…

图形化探索:快速改造单实例为双主、MGR、读写分离等架

单机GreatSQL/MySQL调整架构为多副本复制的好处有哪些&#xff1f;为什么要调整&#xff1f; 性能优化&#xff1a;如果单个GreatSQL服务器的处理能力达到瓶颈&#xff0c;可能需要通过主从复制、双主复制或MGR&#xff0c;以及其他高可用方案等来提高整体性能。通过将读请求分…

SoftwareTest7 - JUnit 是个啥 ? 他跟 Selenium 有什么关系 ?

JUnit 是个啥 ? 他跟 Selenium 有什么关系 ? 一 . 相关注解1.1 Test1.2 BeforeEach1.3 BeforeAll1.4 AfterEach1.5 AfterAll 二 . 断言2.1 assertEquals2.2 assertNotEquals2.3 assertTrue / assertFalse : 断言结果为真/假2.4 assertNull / assertNotNull : 断言结果为空 / …

数据结构—内部排序(下)

文章目录 8.内部排序(下)(6).归并排序#1.先做合并#2.再来排序#3.代码实现#4.稳定性与时间复杂度分析 (7).快速排序#1.算法思想#2.代码实现#3.稳定性与时间复杂度分析 (8).基数排序#1.算法思想#2.稳定性和时间复杂度分析 小结 8.内部排序(下) (6).归并排序 那我们的时间复杂度还…

【评论送书】十本架构师成长和软件架构技术相关的好书(可以任选)

正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 参与规则 本次送书1~5本参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff08;从评论区…

Maven:通过相对路径向jar中添加依赖项

问&#xff1a;我有一个专有的jar&#xff0c;我想把它作为一个依赖项添加到我的pom中。 但我不想把它添加到存储库中。原因是我希望常用的maven命令(如mvn compile等)能够开箱即用。(无需要求开发人员自己将其添加到某个存储库中)。 我希望jar在源代码控制中的第三方库中&…

idea菜单栏任务栏放缩比例修改

在编辑自定义VM选项中增加 -Dide.ui.scale0.8 参数 Help -> Edit Custom VM Options

Visual Studio Code配置c/c++环境

Visual Studio Code配置c/c环境 1.创建项目目录2.vscode打开项目目录3.项目中添加文件4.文件内容5.配置编译器6.配置构建任务7.配置调试设置 1.创建项目目录 d:\>mkdir d:\c语言项目\test012.vscode打开项目目录 3.项目中添加文件 4.文件内容 #include <iostream> u…

Linux C 编程入门 (GCC 和 Makefile的使用和编写)

Linux C 编程入门 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。Ubuntu 下也有一些可以进行编程的工具&#xff0c;但是大多都只是编辑器&#xff0c;也就是只能进行代码编辑&#xff0c;如果要编译的话就需要用到 GCC 编译器&…

基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境模块实现1. 训练集图片处理1&#xff09;数据加载2&#xff09;图像处理 2. 测试图片处理1&#xff09;图像读取2&#xff09;图像处理 相关其它博客工程源代码下载其它资料下载 前言 本项目基于从网络获取的多种银行卡数据…