算法日记-链表翻转

news2024/10/4 6:02:39

文章目录

    • 场景:
    • 解法一:迭代
      • 步骤
      • 完整代码
    • 解法二:递归
      • 步骤
      • 完整代码

重温力扣常规算法,记录算法的演变,今天介绍的是链表翻转

场景:

现在有一条单项链表,链表节点存在一个数据和指向下一个节点的指针, 如何将其翻转过来?
在这里插入图片描述
输入 100->200->300->400->500
输出 500->400->300->300->100

针对该场景,我们有多种解决方式,这里我们介绍最常见的两种

解法一:迭代

从前往后遍历链表,处理当前节点时,需要将用额外的变量保存当前节点指向前后的节点指针,从而可以方便改变指针指向的具体信息,然后不停地重复该过程。下面我们来具体操作

步骤

1、定义链表节点结构ListNode,包含两个变量val和next

2、我们需要定义两个变量,变量的类型为ListNode,分别存储当前节点前后地指针信息,分别为prev和next,传入头节点
在这里插入图片描述
3、将头节点赋值为curr,开始循环处理,将下一个节点指针保存到next变量 next=curr.next
在这里插入图片描述
4、将节点指针指向前一个节点prev,curr.next=prev
在这里插入图片描述
5、准备处理下一个节点,将curr赋值给prev
在这里插入图片描述
6、将下一个节点赋值为curr,接着处理下一个节点
在这里插入图片描述

public static ListNode reserse(ListNode head) {
     ListNode prev = null;
     ListNode next;
     ListNode curr = head;
     while (curr != null){
     	 //将当前节点未改变前 指向下一节点的信息 保存到next变量
         next = curr.next;
         //改变当前节点的指针指向, 将节点指针指向前一个节点prev
         curr.next = prev;
         //节点改变完了,然后把自己变成前一个节点,则将当前节点信息保存到prev变量
         prev = curr;
         //接着将下一节点赋予当前节点,准备处理下一节点
         curr = next;
     }
     //返回头节点
     return prev;
 }

完整代码

下列是完整代码,包含测试代码

package com.cys.algorithm;

public class ReverseList {

    static class ListNode {
        int val;
        ListNode next;

        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    public static ListNode reserse(ListNode head) {
        ListNode prev = null;
        ListNode next;
        ListNode curr = head;
        while (curr != null){
             //将当前节点未改变前 指向下一节点的信息 保存到next变量
	         next = curr.next;
	         //改变当前节点的指针指向, 将节点指针指向前一个节点prev
	         curr.next = prev;
	         //节点改变完了,然后把自己变成前一个节点,则将当前节点信息保存到prev变量
	         prev = curr;
	         //接着将下一节点赋予当前节点,准备处理下一节点
	         curr = next;
        }
        return prev;
    }

    public static void main(String[] args) {
        ListNode node5 = new ListNode(500, null);
        ListNode node4 = new ListNode(400, node5);
        ListNode node3 = new ListNode(300, node4);
        ListNode node2 = new ListNode(200, node3);
        ListNode node1 = new ListNode(100, node2);
        ListNode prev = reserse(node1);
        System.out.println(prev.val);
        System.out.println(prev.next.val);

    }
}

测试代码运行结果
在这里插入图片描述

解法二:递归

递归的思路其实就是把一个大问题分成许多个小问题,然后寻找到解决办法以后,再将方法推广到全局。

步骤

1、通过头部节点,不停地遍历,直到next指针指向为null,找到最后一个元素
在这里插入图片描述
2、如果遇到最后一个元素,则返回。接着将最后一个元素指向倒数第二个元素,并且将倒数第二个元素的指向替换成null,然后继续返回,以此类推
在这里插入图片描述

完整代码

下列是完整代码,包含测试代码

package com.cys.algorithm;

public class ReverseList {

    static class ListNode {
        int val;
        ListNode next;

        public ListNode(int val, ListNode next) {
            this.val = val;
            this.next = next;
        }
    }

    public static ListNode reserse(ListNode head) {
        if (head == null || head.next == null){
            return head;
        }
        ListNode newHead = reserse1(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;
    }

    public static void main(String[] args) {
        ListNode node5 = new ListNode(500, null);
        ListNode node4 = new ListNode(400, node5);
        ListNode node3 = new ListNode(300, node4);
        ListNode node2 = new ListNode(200, node3);
        ListNode node1 = new ListNode(100, node2);
        ListNode prev = reserse(node1);
        System.out.println(prev.val);
        System.out.println(prev.next.val);

    }
}

测试代码运行结果
在这里插入图片描述

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

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

相关文章

MySQL--三大范式(超详解)

目录 一、前言二、三大范式2.1概念2.2第一范式(1NF)2.3第二范式(2NF)2.3第三范式(3NF) 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进…

AI不可尽信

看到某项目有类似这样的一段代码 leaves : make([]int, 10) leaves leaves[:0]没理解这样的连续两行,有何作用? 初始化一个长度和容量都为10的切片,接着把切片长度设置为0 即如下demo: (在线地址) package mainimport "fmt"func main() {leaves : make([]int, 1…

【2023工业3D异常检测文献】CPMF: 基于手工制作PCD描述符和深度学习IAD结合的AD方法

Complementary Pseudo Multimodal Feature for Point Cloud Anomaly Detection 1、Background 早期的点云异常检测(PCD)表示是手工制作的,依赖于启发式设计。随着深度学习的发展,最近的方法采用了基于学习的PCD特征。尽管与基线相比有相当大的改进&…

欧几里得算法--(密码学基础)

根基:gcd(a,b)gcd(b,a mod b) 先举个例子吧,gcd(16,6)gcd(6,4)gcd(4,2)gcd(2,0)2 学习这个定理的时候我想了几个问题. 第一个问题:为什么求出的就一定是他们两个数的公约数? 这个问题很简单我们只需要通过几何来计较即可&#x…

MyBatis——ORM

MyBatis——ORM 验证映射配置ResultType本质是ResultMap具体的转换逻辑 概括的说,MyBatis中,对于映射关系的声明是由开发者在xml文件手动完成的。比如对查询方法而言,你需要显式声明ResultType或ResultMap,这里其实就是在定义数据…

Java JUC(三) AQS与同步工具详解

Java JUC(三) AQS与同步工具详解 一. ReentrantLock 概述 ReentrantLock 是 java.util.concurrent.locks 包下的一个同步工具类,它实现了 Lock 接口,提供了一种相比synchronized关键字更灵活的锁机制。ReentrantLock 是一种独占…

【Kubernetes】常见面试题汇总(五十三)

目录 118. pod 状态为 ErrlmagePull ? 119.探测存活 pod 状态为 CrashLoopBackOff ? 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。…

uniapp使用字体图标 ttf svg作为选项图标,还支持变色变图按

在staic目录下有一些ttf文件,如uni.ttf,iconfont.ttf 这些文件中保存这字体svg的源码们,我们也可以在网上找其他的。这些就是我们要显示的突图标的 显示来源。这样不用使用png图标,选中不选中还得用两个图片 我的具体使用如下 &q…

Python入门--循环语句

目录 1. while循环基础语法 2. while循环的嵌套 3. while实现九九乘法表 4. for循环基础语法 5. for循环的嵌套 6. for循环实现九九乘法表 7. 循环中断:break和continue 循环普遍存在于日常生活中,同样,在程序中,循环功能也…

thinkphp6入门(25)-- 分组查询 GROUP_CONCAT

假设表名为 user_courses,字段为 user_id 和 course_name,存储每个用户选修的课程,想查询每个学生选修的所有课程 SQL 原生查询 SELECT user_id, GROUP_CONCAT(course_name) as courses FROM user_courses GROUP BY user_id; ThinkPHP 代码…

python常用库总结(argparse、re、matlpotlab.plot)

文章目录 1.argparse库字符串(str)布尔值(bool)选择(choices)计数(count)常量(store_const 和 store_true)多个值(nargs)可选参数&…

用Python实现运筹学——Day 9: 线性规划的灵敏度分析

一、学习内容 1. 灵敏度分析的定义与作用 灵敏度分析(Sensitivity Analysis) 是在优化问题中,分析模型参数变化对最优解及目标函数值的影响。它帮助我们了解在线性规划模型中,当某些参数(如资源供应量、成本系数等&a…

SQLServer CXPACKET等待事件

文章目录 SQL Server 中的 CXPACKET 等待类型是最容易被误解的等待统计之一。CXPACKET 这个术语来源于 “Class Exchange Packet”(类交换包)。其本质可以描述为在单个进程的两个并行线程之间交换数据行的过程。其中一个线程是“生产者线程”&#xff0c…

理解Matplotlib构图组成

介绍 Matplotlib 是 Python 中最流行的数据可视化库之一。它提供了一系列丰富的工具,可以绘制高度自定义且适用于各种应用场景的图表。无论你是数据科学家、工程师,还是需要处理数据图形表示的任何人,理解如何操作和定制 Matplotlib 中的图表…

ElasticSearch 备考 -- 备份和恢复

一、题目 备份集群下的索引 task,存储快照名称为 snapshot_1 二、思考 这个涉及的是集群的备份,主要是通过创建快照,涉及到以下2步骤 Setp1:注册一个备份 snapshot repository Setp2:创建 snapshot 可以通过两种方…

Ubuntu18.04安装cuda11.1(出现c++版本问题)

一、概述 需要使用到ubuntu18.04进行cuda的配置,最新版本的cuda跟pytorch的版本不太适配,所以为了能够复现,我选择了一些老版本的cuda11,其使用的范围更加广泛。将自己 二、具体操作 (一)安装流程 1.官网…

为什么疾风气象大模型比传统天气预报更准?

近年来,气象大模型逐渐成为天气预报的核心工具,其预测精度和可靠性远超传统天气预报方法。本文将探讨气象大模型为何比传统天气预报更加准确的原因,分析其优势以及在气象预测领域的应用前景。 1. 传统天气预报的局限性 传统天气预报通常依赖…

win11/win10/windows下快安装并使用git

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Git 的特点?二、GIT安装方法1.打开GIT官网2.下载git安装程序整个安装过程基本上直接用默认选项就可以 总结 前言 提示:GIT介绍 GI…

十一不停歇-学习ROS2第一天 (10.2 10:45)

话题通信 1.1 发布第一个节点: import rclpy #导入此类模块 rcl类型 from rclpy.node import Node #从这个子模块中导入这类函数 def main(): #定义这个函数 rclpy.init() #使用初始化函数 node Node(hello_python) 将类函数里面的内容调给…

Pikachu- SQL Inject - http header 头注入

header 头注入,是一种场景;跟以往的没区别,只是发生在 header 响应头; 有些时候,后台开发人员为了验证客户端头信息(比如常用的cookie验证),或者通过http header头信息获取客户端的一些信息,比…