算法刷题记录6 - 反转链表和链表两两交换

news2025/2/24 17:11:01

哎,都两周没刷题了,罪过

第一题

2023.10.29 周日
上链接
206. 反转链表
难度:简单
代码随想录 文档
代码随想录 视频
这道题说难不难,但是也不知道是太久没写没感觉了还是确实细节多,不看视频确实感觉不出写的问题在哪。。最大的问题是,我忘了单向链表的next赋了新值之后,之前的指向已经断了。。
双指针法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        // 双指针法
        // 思路是 原地调换链表指针指向
        ListNode left = null; // 为什么是null呢?因为反转以后尾结点后面指向的是null
        ListNode right = head;
        ListNode tmp = null;
        // 从头结点朝着尾结点去反转指针方向
        while (right != null) { // 边界值怎么判断呢?当left为原来的尾结点的时候,right应该为null,不用再次指向left了,也就是可以不用再循环了
            tmp = right.next; // 为什么要保存这个呢?因为当右节点的next指向左节点的时候,原来right到原来right.next的链断了,找不到right.next了,循环进行不了了,所以提前保存。
            right.next = left;
            left = right; // 这个也要在right右移之前,调换顺序就不对了
            right = tmp; // 等于tmp,因为此时的right.next已经是left了
        }
        return left; // 循环结束,right为空,left为原来的尾结点也是反转后新表的头结点
    }
}

递归法

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        // 递归法
        return reverse(null, head); // 初始值
    }

    private ListNode reverse(ListNode left, ListNode right) {
        if(right == null) return left; // 递归出口,right为空则不需要再用right指向left
        ListNode tmp = right.next; // 保存下一个节点
        right.next = left; // 指针反向
        // left right 右移
        // left = right;
        // right = tmp;
        return reverse(right, tmp); // 自调用,值为原来更新的位置
    }
}

时空复杂度:On、O1

第二题

2023.10.29 周日
上链接
24. 两两交换链表中的节点
难度:中等
代码随想录 文档
代码随想录 视频
这道题和上一道有非常的类似,都是链表节点指针变换,区别在于边界值判断和怎么改变指针。
过程(黑色是原先的指针,红色是处理后的指针)
在这里插入图片描述
理解了这个图,就能理解这个题怎么做。
然后为什么要保存这么多节点呢?还和上一题一样。以上面这个图为例,
cur指向2,那么cur指向1的指针就断了,2可找不到1,所以提前firstnode记下;
继续,2要指向1,那么2到3就断了,3是下一个操作区间的起点,所以也要提前记下 叫temp;
有一说一,这样其实不用secondnode了,因为这已知的。

第二题还有操作,连temp也不用留,比如说1已经记到firstnode,cur指到2的时候,此时1的next指向3,2的next指向1,其实这轮操作就已经完成了。不过乍一看容易混淆,还是老老实实看上面就行。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode() {}
 *     ListNode(int val) { this.val = val; }
 *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        // # 交换相邻节点顺序
        // # 为了统一处理所有节点,使用虚拟头结点
        if (head == null || head.next == null)
            return head;
        ListNode dummy = new ListNode(-1); // 虚拟头结点
        dummy.next = head;
        ListNode cur = dummy;
        ListNode temp; // 临时节点,保存两个节点后面的节点
        ListNode firstnode; // 临时节点,保存两个节点之中的第一个节点
        ListNode secondnode; // 临时节点,保存两个节点之中的第二个节点
        while (cur.next != null && cur.next.next != null) { // cur开始是dummy,不会为空,奇数节点时,偶数节点时
            temp = cur.next.next.next;
            firstnode = cur.next;
            secondnode = cur.next.next;
            cur.next = secondnode;       // 步骤一
            secondnode.next = firstnode; // 步骤二
            firstnode.next = temp;      // 步骤三
            cur = firstnode; // cur移动,准备下一轮交换
        }
        return dummy.next;
    }
}

时空复杂度:On、O1

小结

前两天看了看py的语法,试图用py去写,发现链表没学还是不大会,哎,再等一会吧。然后今天的题,还是有点掉感觉了,写的也慢。。两道肯定是不够的,感觉不到位,有空继续的时候看看写写加点新的。

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

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

相关文章

GEE错误——影像加载过程中出现的图层无法展示的解决方案

问题: // I dont know if some standard value exists for the radius, in the same, I will assume that some software would prefer to use square shape, but circle makes more sense to me. // pixels is noice if you want to zoom in and out to visualize…

Redis实现分布式锁之----超时和失效(非原子性)问题----解决方案

Redis实现分布式锁之----超时和失效(非原子性)问题----解决方案 超时和失效(非原子性)问题 原子性问题:上锁时存入线程名称,删除时要先判断锁内的名称是不是自己的,是再删除,但是后…

软件测试---边界值分析(功能测试)

选取正好等于、刚好大于、刚好小于边界的值作为测试数据 上点: 边界上的点 (正好等于);必选(不考虑区开闭) 内点: 范围内的点 (区间范围内的数据);必选(建议选择中间范围) 离点: 距离上点最近的点 (刚好大于、刚好小于);开内闭外(考虑开…

常见面试题-MySQL专栏(二)

了解索引扫描吗? 答: MySQL有两种方法生成有序结果: 通过排序操作按照索引顺序扫描 如果 explain 出来的 type 列值为 “index” 的话,说明是按照索引扫描了。 索引扫描本身的速度是很快的。但是如果索引不能覆盖查询所需的全…

【每日一题】H 指数 II

文章目录 Tag题目来源题目解读解题思路方法一:二分查找 写在最后 Tag 【二分查找】【数组】【2023-10-30】 题目来源 275. H 指数 II 题目解读 本题与 274. H 指数 题目一致,只是加强了一下条件,数组是有序的。 解题思路 方法一&#xff…

【Docker】如何查看之前docker run命令启动的参数

个人主页:金鳞踏雨 个人简介:大家好,我是金鳞,一个初出茅庐的Java小白 目前状况:22届普通本科毕业生,几经波折了,现在任职于一家国内大型知名日化公司,从事Java开发工作 我的博客&am…

如何高效制作视频滚动字幕:批量剪辑攻略

在视频制作过程中,添加滚动字幕是常见且重要的环节。它不仅可以帮助传达信息,还能增强视频的观感体验。然而,对于需要大量制作字幕的视频,逐一添加字幕无疑会浪费大量时间和精力。因此,本文将为你介绍运用云炫AI智剪制…

1.让数组动起来

概述 对数组进行分析,目标如下 线性表的概念数组的存储结构数组查询,插入,删除操作的特点及对应的时间复杂度刷题(盛最多水的容器) 线性表 在数据结构中,数据的逻辑结构分为线性结构和非线性结构 线性结构: n个数据元素有序集合…

在 Visual Studio 中远程调试 C++ 项目

目录 一、说明二、下载远程工具1. 官网下载2. 自己电脑上拷贝 三、 运行远程工具四、本机Visual Studio配置五、自动部署 一、说明 参考官方文档:https://learn.microsoft.com/zh-cn/visualstudio/debugger/remote-debugging-cpp?viewvs-2022 二、下载远程工具 …

【C语言】calloc()函数详解(动态内存开辟函数)

🦄个人主页:修修修也 🎏所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 一.calloc()函数简介 我们先来看一下cplusplus.com - The C Resources Network网站上calloc()函数的基本信息: 1.函数功能 可以看到,calloc()函数的功能是:为num个大…

FastAPI框架学习笔记(快速入门FastAPI框架)

1. 写在前面 今天整理一篇后端框架的笔记, fastapi框架是比较主流的后端异步web框架,关键是python语言可以写,正好公司最近安排了一些后端服务的活, 所以就看了一个fastapi框架的入门课程(链接在底部),完成任务&#…

用户登录前后端开发(一个简单完整的小项目)——SpringBoot与session验证(带前后端源码)全方位全流程超详细教程

🧸注:不要看我的文件多,那是我的其他项目,这个项目所用的文件我会全部用红框框起来,没框的部分不用管,前端两个文件,后端一个文件 📜 目录 首先,定义前后端交互接口 然…

电子器件 电感

拿一根导线在笔上绕几圈,取下来就是一个空心电感,如果拿一个铁芯,在铁芯上绕相同的圈数,加了的铁芯的电感量是没有加铁芯的几千倍甚至上万倍,所以电感一般是有铁芯的。 下图是电感的模型,L 是理想电感&…

招生报名缴费小程序开发笔记(上)

前期调研 1.数字化趋势: 随着社会的数字化转型,越来越多的教育机构倾向于采用数字工具来简化和优化他们的招生和报名过程。招生报名缴费小程序是应对这一趋势的一种解决方案,可以提供高效、方便、快速的在线招生渠道。2.用户需求&#xff1a…

强化学习中值函数应用示例

一、Gridworld Gridworld是一个用于教授强化学习概念的简化的电子游戏环境。它具有一个简单的二维网格,智能体可以在其中执行动作并获得奖励。这个环境是有限的,因为它有一个明确的开始和结束状态,以及一组确定的动作和奖励。 在Gridworld中&…

C++二分查找算法的应用:最长递增子序列

涉及知识点 二分查找 单调映射 源码下载 点击下载源码 题目 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如&#xf…

Rust 语言介绍及安装

目录 1、简介 1.1 为什么选择Rust 高性能 可靠性 生产力 1.2 用 Rust 构建应用 命令行 WebAssembly 网络 嵌入式 2、安装 Rust Windows 的 Linux 子系统(WSL) 检查Rust 是最新的 卸载Rust版本: Cargo:Rust 的构建工…

读图数据库实战笔记03_遍历

1. Gremlin Server只将数据存储在内存中 1.1. 如果停止Gremlin Server,将丢失数据库里的所有数据 2. 概念 2.1. 遍历(动词) 2.1.1. 当在图数据库中导航时,从顶点到边或从边到顶点的移动过程 2.1.2. 类似于在关系数据库中的查…

我在Vscode学OpenCV 初步接触

OpenCV是一个开源的计算机视觉库,可以处理图像和视频数据。它包含了超过2500个优化过的算法,用于对图像和视频进行处理,包括目标识别、面部识别、运动跟踪、立体视觉等。OpenCV支持多种编程语言,包括C、Python、Java等&#xff0c…

光谱图像论文浅读

文章目录 Hyperspectral Image Super-Resolution via Deep Spatiospectral Attention Convolutional Neural Networks Hyperspectral Image Super-Resolution via Deep Spatiospectral Attention Convolutional Neural Networks 通过上采样高光谱保留其光谱特征,采用…