当前位置: 首页 > news >正文

每日一题(LeetCode)----链表--两两交换链表中的节点

每日一题(LeetCode)----链表–两两交换链表中的节点

1.题目([24. 两两交换链表中的节点](https://leetcode.cn/problems/spiral-matrix/))

  • 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

    示例 1:

    在这里插入图片描述

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

    输入:head = []
    输出:[]
    示例 3:

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

    提示:

    链表中节点的数目在范围 [0, 100] 内
    0 <= Node.val <= 100

2.解题思路

思路一

先拆分成两个链表之后再进行合并
1.拆分

我们遍历一遍原链表,通过下标的奇偶拆分成两个链表

2.合并

(1)我们以通过下标为奇数得到的链表的表头作为新链表的表头,然后用两个指针变量交叉遍历两个链表(交叉遍历就是一个链表向后遍历了一个节点之后就换另一个链表向后遍历一个节点,这样循环,直到两个链表都遍历完成结束)

(2)将遍历到的节点放到新链表中即可(这里说是放到新链表中实际上只是改变了两个链表中的指针指向)

(3)最后我们返回这个新链表的表头

注意:如果给出的链表没有节点或者只有一个节点,我们不需要进行操作,直接返回原有链表即可
思路二:迭代法
1.我们创建一个虚拟头节点方便我们进行迭代操作,如下图

在这里插入图片描述

2.遍历链表实现两两交换

如果当前操作节点的下一个和当前操作节点的下一个的下一个的下一个同时不为空,进行下面操作

先保存一下当前操作节点的下一个节点和下一个的下一个节点为临时节点一和临时节点二

第一步:当前操作节点的下一个指向操作开始的节点的下一个的下一个, 第二步:当前操作节点的下一个的下一个指向临时节点一 第三步:当前操作节点的下一个的下一个的下一个指向临时节点二 第四步:下一次操作节点为当前操作节点的下一个的下一个,继续进行操作

看下图进行理解

在这里插入图片描述

思路三:递归法

递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。

如果链表中至少有两个节点,则在两两交换链表中的节点之后,原始链表的头节点变成新的链表的第二个节点,原始链表的第二个节点变成新的链表的头节点。链表中的其余节点的两两交换可以递归地实现。在对链表中的其余节点递归地两两交换之后,更新节点之间的指针关系,即可完成整个链表的两两交换。

3.写出代码

思路一的代码
class Solution {
public:ListNode* swapPairs(ListNode* head) {//如果链表中没有元素,那么返回链表即可if(head==nullptr||head->next==nullptr){return head;}//拆成两个链表ListNode* head1=head;ListNode* head2=head->next;ListNode* Temp1=head1;ListNode* Temp2=head2;//进行拆分int flag=0;while(Temp1&&Temp2){if(flag%2==0){Temp1->next=Temp2->next;Temp1=Temp1->next;flag++;}else{Temp2->next=Temp1->next;Temp2=Temp2->next;flag++;}}Temp1=head1;Temp2=head2;flag=0;while(Temp1&&Temp2){if(flag%2==0){ListNode* delay2=Temp2->next;Temp2->next=Temp1;Temp2=delay2;flag++;}else{ListNode* delay1=Temp1->next;Temp1->next=Temp2;Temp1=delay1;flag++;}}return head2;}
};
思路二的代码
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* dummyhead=new ListNode(0);dummyhead->next=head;ListNode* cur=dummyhead;while(cur->next!=nullptr&&cur->next->next!=nullptr){ListNode* temp1=cur->next;ListNode* temp2=cur->next->next->next;cur->next=cur->next->next;cur->next->next=temp1;cur->next->next->next=temp2;cur=cur->next->next;}return dummyhead->next;}
};
思路三的代码
class Solution {
public:ListNode* swapPairs(ListNode* head) {if(head==nullptr||head->next==nullptr){return head;}ListNode* newHead=head->next;head->next=swapPairs(newHead->next);newHead->next=head;return newHead;}
};

相关文章:

每日一题(LeetCode)----链表--两两交换链表中的节点

每日一题(LeetCode)----链表–两两交换链表中的节点 1.题目&#xff08;[24. 两两交换链表中的节点](https://leetcode.cn/problems/spiral-matrix/)&#xff09; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内…...

竞赛选题 身份证识别系统 - 图像识别 深度学习

文章目录 0 前言1 实现方法1.1 原理1.1.1 字符定位1.1.2 字符识别1.1.3 深度学习算法介绍1.1.4 模型选择 2 算法流程3 部分关键代码 4 效果展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 毕业设计 图像识别 深度学习 身份证识别…...

什么时候用@MapperScan 注解?

hello,我是小索奇&#xff0c;给大家讲解一下MapperScan注解的用法。 MapperScan 注解是 MyBatis 框架中的一个注解&#xff0c;它的主要作用是扫描指定包路径下的 Mapper 接口&#xff0c;将其注册为 Spring 的 Bean。这样&#xff0c;在使用 MyBatis 进行数据库操作时&#…...

MQTT.js

MQTT.js mqtt.js简介MQTT测试工具mqttboxMQTTX mqtt使用mqtt引入&#xff08;方式一&#xff09;mqtt引入&#xff08;方式二&#xff09;创建mqtt客户端连接到mqtt代理订阅topic处理接收到的消息重新连接取消订阅发布消息断开连接关闭客户端MQTT APIMQTT在VUE中使用MQTT在Reac…...

html滑动文章标题置顶

position: sticky; 基于用户的滚动位置来定位 首先封装一个组件 例如&#xff1a;AAA组件&#xff08;注意&#xff0c;只能有一层盒子&#xff0c;不能在外面继续包一层div&#xff09; <template><div class"box">{{title}}</div> </templa…...

Android11 桌面默认横屏导致任务键近期任务布局UI显示错误!

/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java 定义变量&#xff1a;private boolean stch false; keyCode KeyEvent.KEYCODE_APP_SWITCH 取消原来逻辑&#xff0c;采用广播打开近期任务后台 /*/ if (!keyguardOn…...

「Verilog学习笔记」根据状态转移图实现时序电路

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 这是一个典型的米利型状态机。三段式即可解决。 米利型状态机&#xff1a;即输出不仅和当前状态有关&#xff0c;也和输入有关。 其中ST0&#xff0c;ST1&#xff0c;ST3的…...

使用DHorse发布SpringBoot项目到K8S

前言 在介绍DHorse的操作之前&#xff0c;先来介绍一下使用k8s发布应用的步骤&#xff0c;以SpringBoot应用为例进行说明。 1.首先从代码仓库下载代码&#xff0c;比如GitLab&#xff1b; 2.接着进行构建&#xff0c;比如使用Maven&#xff1b; 3.如果要使用k8s作为编排&am…...

Java修仙记之记录一次与前端女修士论道的经历

文章开始之前&#xff0c;想跟我念一句&#xff1a;福生无量天尊&#xff0c;无量寿佛&#xff0c;阿弥陀佛 第一场论道&#xff1a;id更新之争 一个天气明朗的下午&#xff0c;前端的小美女长发姐告诉我&#xff1a;嘿&#xff0c;小后端&#xff0c;你的代码报错了 我答道&am…...

初识linux(1)

文章目录 什么是linux什么是操作系统&#xff1f;开源 怎么装linux的环境基础指令lspwdcdtouchmkdirrmdir与rmmancpmv 什么是linux linux是一款开源操作系统 什么是操作系统&#xff1f; 操作系统&#xff1a;一种对计算机所有计算机软硬件进行控制和管理的系统软件 开源 开源&…...

投资黄金:如何选择正确的黄金品种增加收益?

黄金一直以来都是备受投资者青睐的避险资产&#xff0c;然而&#xff0c;在庞大的黄金市场中&#xff0c;选择适合自己的黄金品种成为影响收益的关键因素。黄金投资并不只有一种方式&#xff0c;而是有很多种不同的黄金品种可以选择。每种黄金品种都有其独特的特点和风险&#…...

Rust错误处理机制:优雅地管理错误

大家好&#xff01;我是lincyang。 今天&#xff0c;我们要探讨的是Rust语言中的错误处理机制。 Rust作为一种系统编程语言&#xff0c;对错误处理的重视程度是非常高的。它提供了一套既安全又灵活的机制来处理可能出现的错误。 Rust错误处理的两大类别 在Rust中&#xff0…...

docker-compose安装harbor

docker-compose安装harbor 环境&#xff1a;centos7 1、安装docker 官方文档 https://docs.docker.com/engine/install/centos/ 1、卸载旧版本 $ sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate …...

【python学习】基础篇-常用模块-shutil文件和目录操作

shutil模块是Python标准库中的一个模块&#xff0c;提供了对文件和目录进行高级操作的函数。 以下是shutil模块的一些常用函数&#xff1a; 1.复制文件&#xff1a; 将源文件src复制到目标文件dst。如果follow_symlinks为True,则会跟随符号链接。 shutil.copy(src, dst, *, f…...

鸿蒙系统调研适配

写在前面&#xff1a; 以下内容基于我个人翻阅的官方资料以及自己的理解写的&#xff0c;可能存在认知和理解上的偏差&#xff0c;有些地方并不一定是对的&#xff0c;请谨慎对待&#xff0c;注意甄别&#xff01; 一、鸿蒙OS是什么&#xff1f; 华为推出的多端统一平台&…...

SAP gui 登录条目不让修改

今天碰到用户安装的GUI 770 版本&#xff0c;不让修改&#xff0c;也不让添加 后面再选项里面找到了...

华为ac+fit无线2层漫游配置案例

ap的管理dhcp在ac上&#xff0c;业务dhcp在汇聚交换机上、并且带2层漫游 R1: interface GigabitEthernet0/0/0 ip address 11.1.1.1 255.255.255.0 ip route-static 12.2.2.0 255.255.255.0 11.1.1.2 ip route-static 192.168.0.0 255.255.0.0 11.1.1.2 lsw1: vlan batch 100…...

nginx的location中配置路径讲解

初次接触&#xff1a;可能会遇到404找不到页面的错误&#xff0c;主要原因是配置路径问题&#xff1b; 规则&#xff1a;ip port 等于 root&#xff0c;假设server的配置如下&#xff1a; server { listen 80; #端口号 location / { root /opt/sta…...

No appropriate protocol -- Mysql

DataGrip连接mysql报以下异常信息&#xff1a; javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate) The following required algorithms might be disabled: SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5wi…...

Using Set Processing Effectively 有效地使用集合处理

Using Set Processing Effectively 有效地使用集合处理 The information in the topics that follow applies if you are developing new or upgrading older Application Engine programs to adhere to a set-based model. 如果要开发新的应用程序引擎程序或升级旧的应用程序…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)

目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 &#xff08;1&#xff09;输入单引号 &#xff08;2&#xff09;万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

命令行关闭Windows防火墙

命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)​方法二:CMD命令…...