【刷题之路】LeetCode24——详解两两交换链表中的结点的细节

news2024/11/25 7:49:39

一、题目描述

原题链接:https://leetcode.cn/problems/swap-nodes-in-pairs/comments/

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

二、解题

方法1:迭代(哨兵位)

思路分析:

  这道题目要是没有使用哨兵位的话,会写的十分复杂。首先我们知道要两个两个地翻转链表(不能交换链表中的值),需要先知道这两个结点的前一个结点(如需翻转cur和last,则需要prev)

具体操作为last->next=cur,prev->next=last,cur应该指向NULL但是我们发现此时找不到了,所以在操作last->next之前我们应该先保存last->next(struct ListNode*tmp=last-》next),即cur->next=tmp。

但是在翻转头两个结点的时候就会出现问题,因为此时没有头结点的前一个结点,所以这个时候就需要一个哨兵位了,不然头两个就要额外操作,写起来就十分麻烦了。

哨兵位还有另外一个好处,就是dummyhead的next就是翻转完需要返回的头结点,而没有哨兵位就需要额外记录一下head->next,最后再返回,有点麻烦。

至此,总体的思路就有了,就是创建dummyhead,然后两个两个翻转,不断迭代,那么迭代的条件是什么呢?当链表有偶数个的时候所有的结点都参与翻转,但是当链表有奇数个的时候最后一个结点就不参与翻转,所以迭代结束的条件就是prev或者cur或者last为空了,即while(prev&&cur&&last),这里仍有一个小细节需要注意,就是cur需要写在last之前,不然可能会出现空指针的解引用,因为cur比last前一个位置。

有了思路,写起来也就行云流水啦。

代码实现:

struct ListNode* swapPairs(struct ListNode* head){
    //使用双指针避免使用中间变量
    typedef struct ListNode ListNode;
    ListNode *dummyhead = (ListNode *)malloc(sizeof(ListNode));
    dummyhead->next = head;

    ListNode* prev = dummyhead; 
    ListNode* cur = dummyhead->next;
    while(prev && cur && cur->next )
    {
        prev->next = cur->next;
        cur->next = prev->next->next;
        prev->next->next = cur;
        prev = cur;
        cur = prev->next;
    }
    return dummyhead->next;
}

总结

总的来说这道题不算很难,但十分考验我们对链表的基础操作,以及对哨兵位的使用,相信对每个人都会有所帮助。

希望大家多多支持,我也会继续输出我的编程知识的!

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

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

相关文章

linux下将结果保存为图片,因为服务器是命令行界面,无法弹出窗口

解决方法来自GitHub:https://github.com/open-mmlab/mmdetection/issues/1405 The code below can show and save image with result. import mmcv import cv2 from mmcv.runner import load_checkpoint from mmdet.models import build_detector from mmdet.apis i…

C语言结构体位域

目录 一、C语言位域是什么? 二、位域详解 定义格式: 1. 数据类型排序改变,位域长度不变 2. 数据类型排序不变,位域长度改变 3.根据以上代码的验证可以得出以下计算位域结构体数据的方法: 三.位域的结构体数据如何进行print…

感恩有你:毕业论文致谢部分写作指南

现在正值毕业论文写作最后收尾阶段,估计很多同学开始各处收集如何写致谢这个部分。之前写过一篇文章中引用一位导师的“抱怨”,文章题目为“211导师深夜含泪发文:在你长达5万字的毕业论文中,我最欣赏致谢部分”,所以为…

Java面试题spring

Spring 1、不同版本的 Spring Framework 有哪些主要功能? 2、什么是 Spring Framework? Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。 它具有分层体系结构,允许用户选择组件&#xff0c…

国考省考行测:资料分析题,年均增长量

国考省考行测:资料分析题,年均增长量 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重要的还是申论和行测,所以大家认真准备吧,我讲一起屡屡申…

Docker基础篇

1、为什么Docker比VM快 2、帮助启动类命令 启动类命令 启动docker: systemctl start docker停止Docker: systemctl stop docker重启Docker: systemctl restart docker查看状态: systemctl status docker设置开机自启&#x…

stable diffusion webui 教程:安装与入门

stable diffusion webui 安装与入门 一、源码仓库二、模型库地址三、在 Windows 上自动安装步骤安装Python安装git下载源代码编辑 webui-user.bat 四、如何打开五、依据文字生成图片六、API在哪里?七、用python调用API接口示例八、如何制作生成精美的图片1、下载模型…

Qt--多窗口编程

目录 1. QMessageBox 消息对话框(掌握) 示例代码: dialog.h dialog.cpp dialog.ui 运行结果: 2. 窗口类继承关系 dialog.cpp 3. QMainWindow 主窗口类 3.1 QMenuBar 菜单栏 3.2 QToolBar 工具栏 3.3 QWidget 中心组件 3.4 QStatu…

外强中干——双向带头循环链表

前言:众所周知,链表有八种结构,由单向或双向,有头或无头,循环或不循环构成。在本篇,将介绍8种链表结构中最复杂的——双向带头循环链表。听着名字或许挺唬人的,但实际上双向带头循环链表实现起来…

九盾安防智能叉车管理系统告诉你叉车电池安全使用的十要点

叉车电池是叉车的动力源,对于保证叉车安全运行具有非常重要的作用。但是,叉车电池在使用过程中也会存在一些安全问题,如果使用不当可能会引起严重后果。下文就九盾安防智能叉车管理系统介绍叉车电池安全使用的十要点。 一、保证通风良好。在使…

课程《JavaWeb基础框架程序设计》考试题下篇——数据库与表单操作用题(人事管理平台的添加员工档案信息的操作题)

文章目录 📋前言🎯第三题(40分)🎯报错以及解决方法📝最后 📋前言 这篇文章是大学课程《JavaWeb基础框架程序设计》考试题目的内容,包括了原题和答案。题目只包括了三道编程题&#…

2直接连接的网络与VLAN划分-2.3【实验】【计算机网络】

2直接连接的网络与VLAN划分-2.2-2.3【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网2.2交换机MAC地址表建立与帧转发2.3 STP工作过程实验目的实验内容及实验环境实验原理物理环路引发的问题1:广播风暴物理环路引发的问题2:MAC地址表翻…

ChatGPT之公文写作

公务文章主要适用于政府部门、机关、事业单位以及其他公共组织的文件、公告、通知等文稿。 根据《党政机关公文处理工作条例》,公文种类主要有15种。按照行文流向,可以分为上行文、平行文、下行文。 1、上行文:请示、报告、意见。 2、平行…

Qt 文件IO

目录 1. QFileDialog 文件选择对话框 示例代码 dialog.h dialog.cpp dialog.ui 运行效果: 2. QFileInfo 文件信息类 dialog.cpp 3. QFile 文件读写类 UI与耗时操作 QThread 线程类 1 复现阻塞 dialog.h dialog.cpp 2.新建并启动子线程 mythread.h mythread.cpp dial…

Py之tf2onnx:tf2onnx库的简介、安装、使用方法之详细攻略

Py之tf2onnx:tf2onnx库的简介、安装、使用方法之详细攻略 目录 tf2onnx库的简介 tf2onnx库的安装 tf2onnx库的使用方法 1、基础用法 tf2onnx库的简介 tf2onnx是一个将TensorFlow(tf-1.x或tf-2.x)、keras、tensorflow.js和tflite模型转换…

【python安装】linux环境安装python

linux环境安装python 小白都能看懂的python安装前置步骤下载python安装python 小白都能看懂的python安装 前置步骤 使用 python -V 或者 python -version 查看是否安装python如果Linux有python3需要更新指定版本的话,先把自带的删除,输入 rpm -qa|grep…

JavaScript通过js的方式来计算平行四边形的面积的代码

以下为通过js的方式来计算平行四边形的程序代码和运行截图 目录 前言 一、通过js的方式来计算平行四边形(html部分) 1.1 运行流程及思想 1.2 代码段 二、通过js的方式来计算平行四边形(js部分) 2.1 运行流程及思想 2.2 代码…

算法修炼之练气篇——练气六层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

算法修炼之练气篇——练气十七层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

SpringBoot+Token+Redis+Lua+自动续签极简分布式锁Token登录方案

前言 用SpringBoot做一个项目,都要写登录注册之类的方案 使用Cookie或Session的话,它是有状态的,不符合现代的技术 使用Security或者Shiro框架实现起来比较复杂,一般项目无需用那么复杂 使用JWT它虽然是无状态的,也可…