【算法专题--链表】两两交换链表中的节点 -- 高频面试题(图文详解,小白一看就懂!!!)

目录

一、前言

二、题目描述 

三、解题方法

⭐双指针 -- 采用哨兵位头节点

🥝 什么是哨兵位头节点?

🍍 解题思路   

🍍 案例图解  

四、总结与提炼 

五、共勉  


一、前言

        两两交换链表中的节点 这道题,可以说是--链表专题--,最经典的一道题,也是在面试中频率最高的一道题目,通常在面试中,面试官可能会从多个方面考察这道题目,所以大家需要对这道题目非常熟悉哦!!
       本片博客就来详细的讲讲解一下 两两交换链表中的节点 的实现方法,让我们的面试变的更加顺利!!! 

二、题目描述 

题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode)

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

三、解题方法

⭐双指针 -- 采用哨兵位头节点

🥝 什么是哨兵位头节点?

首先,先来了解一下什么是  哨兵位---头节点 ?   

  • 它是一个附加的链表结点,该 结点 作为 第一个节点它的数据域不存储任何东西,只是为了操作的方便而引入的。
  • 也就是说,如果一个链表有哨兵节点的话,那么链表表的第一个元素应该是链表的第二个节点。

   哨兵位 --- 头节点的作用:  

  • 比如向链表中插入一个节点,对于没有哨兵位单链表当待插入的节点为链表的第一个节点,由于没有前驱,需要进行特殊处理,从而代码的复杂性增加 
  • 如果有哨兵位头节点,则第一个节点的处理方式与其它节点相同,可以统一进行处理

 🍍 解题思路   

  • 我们设置一个哨兵头节点 pre_head,初始时指向 pre_head ->head ,然后设置两个指针 pre 和 cur,初始时 pre 指向 pre_head,而 cur 指向 head
  • 接下来,我们遍历链表,每次需要交换 pre 后面的两个节点,因此我们先判断 cur 和 cur.next 是否为空,若不为空,则进行交换,否则终止循环。


🍍 案例图解  

  链表:【1,2,3,4】 

  • 创建 哨兵位头节点双指针开始遍历整个链表 

  •  开始 交换 节点 1、2 ,先把 1 指向 3

  • 再把 2 指向 1,进行交换

  •  再把 -1 指向 2,进行交换

  •  完成 第一次交换,双指针,向前移动,准备进行下一次交换

  •  重复,上述操作,进行 节点3、4 交换

  • cur ==nullptr循环结束 ,返回 pre_head->next 

复杂度分析 : 

  • 时间复杂度:O(n)     其中 n为链表长度。
  • 空间复杂度:O(1)    仅用到若干额外变量。

代码:

class Solution {
public:ListNode* swapPairs(ListNode* head) {// 创建一个哨兵位 头节点,并连接 原来的头节点ListNode* pre_head = new ListNode(-1,head);// 三指针 解法ListNode* pre = pre_head;ListNode* cur = head;//  cur != nullptr 表示偶数个节点  , cur->next!=nullptr 表示奇数个节点while(cur!=nullptr && cur->next!=nullptr){ListNode* nextnode = cur->next;// 开始翻转cur->next = nextnode->next;nextnode->next = cur;pre->next = nextnode;// 指针向后移动,准备下一次翻转pre = cur;cur = cur->next;}return pre_head->next;}
};

 四、总结与提炼 

       最后我们来总结一下本文所介绍的内容,本文讲解来一道力扣中有关 两两交换链表中的节点的题目,这道题目是校招笔试面试中有关链表章节非常高频的一道题目大家下去一定要自己再画画图,分析一下,把这段代码逻辑自己实现一遍,才能更好地掌握  

五、共勉  

       以下就是我对 两两交换链表中的节点 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对 链表专题 的理解,请持续关注我哦!!!  

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

K8S - 在集群内反向代理外部资源 - headless service 的使用

在上一篇文章中 K8S - 理解ClusterIP - 集群内部service之间的反向代理和loadbalancer 介绍了 ClusterIP 的主要作用 : 在k8s 集群内部 代理 内部的多实例 service 但是ClusterIP 还有1个变种 -> 无头服务 (headless service) 它用于代理集群外部的 ip资源 当然代理外部资…

AI应用带你玩系列之SadTalker

前段时间我刷微信视频,我无意间点开了一个,画面缓缓展开,是一幅精致的水墨画,画中人物皆是古代装束,衣袂飘飘,仿佛能闻到墨香。然而,这宁静的画面突然被打破了,画中的人物开始动了起…

初识 SpringMVC,运行配置第一个Spring MVC 程序

1. 初识 SpringMVC,运行配置第一个Spring MVC 程序 文章目录 1. 初识 SpringMVC,运行配置第一个Spring MVC 程序1.1 什么是 MVC 2. Spring MVC 概述2.1 Spring MVC 的作用: 3. 运行配置第一个 Spring MVC 程序3.1 第一步:创建Mave…

鸿蒙开发系统基础能力:【@ohos.faultLogger (故障日志获取)】

故障日志获取 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import faultLogger from ohos.faultLoggerFaultType 故障类型枚举。 系统能力: 以下各项对应的系统能力…

利用MSSQL模拟提权

点击星标,即时接收最新推文 本文选自《内网安全攻防:红队之路》 扫描二维码五折购书 利用MSSQL模拟提权 在MS SQL数据库,可以使用EXECUTE AS语句,以其他用户的上下文执行SQL查询。需要注意的是只有明确授予模拟(Impers…

vuex的深入学习[基于vuex3]----篇(二)

store对象的创建 store的传递图 创建语句索引 创建vuex的语句为new Vuex.Store({…})Vuex的入口文件是index.js,store是index.js导出的store类store类是store.js文件中定义的。 Store的构造函数constructor 判断vuex是否被注入,就是将vue挂载在window对象上&am…

Java | Leetcode Java题解之第169题多数元素

题目: 题解: class Solution {public int majorityElement(int[] nums) {int count 0;Integer candidate null;for (int num : nums) {if (count 0) {candidate num;}count (num candidate) ? 1 : -1;}return candidate;} }

TLS握手中的RTT

文章目录 TLS 1.2 握手过程中的 RTT 次数TLS 1.3 1-RTT 初次TLS1.3 0-RTT 握手过程总结 TLS 1.2 握手过程中的 RTT 次数 TLS 1.2 握手通常需要2 RTT 才能完成。具体步骤如下: 第一次 RTT: 客户端发送 ClientHello:客户端生成一个随机数&…

26.3 Django路由层

1. 路由作用 在Django中, URL配置(通常称为URLconf)是定义网站结构的基础, 它充当着Django所支撑网站的目录. URLconf是一个映射表, 用于将URL模式(patterns)映射到Python的视图函数或类视图上. 这种映射机制是Django处理HTTP请求的基础, 它决定了当客户端发送请求时, Django如…

消息认证码解析

1. 什么是消息认证码 消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。 消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据&#x…

AIGC-Animate Anyone阿里的图像到视频 角色合成的框架-论文解读

Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 论文:https://arxiv.org/pdf/2311.17117 网页:https://humanaigc.github.io/animate-anyone/ MOTIVATION 角色动画的目标是将静态图像转换成逼真的视频,这在在线零…

ip地址怎么写才是的对的?合法ip地址正确的格式

IP地址怎么写才是的对的?在互联网的世界里,IP地址就像是我们生活中的门牌号码,它是每个设备在网络中的唯一标识。正确的书写IP地址对于确保网络通信的顺畅至关重要。本文将带您了解合法IP地址的正确格式与书写规范,并深入探讨其在…

css如何动态累计数字?

导读:css如何动态累计数字?用于章节目录的序列数生成,用css的计数器实现起来比 js方式更简单! 伪元素 ::after ::before伪元素设置content 可以在元素的首部和尾部添加内容,我们要在元素的首部添加序列号&#xff0c…

Spring AI 介绍以及与 Spring Boot 项目整合

Spring AI 项目旨在简化使用 Spring Boot 开发包含人工智能功能的应用程序,提供抽象和支持多种模型提供商及矢量数据库提供商。 Spring AI 的功能特点 支持主流模型提供商:如 OpenAI、Microsoft、Amazon、Google 和 Huggingface 等。支持多种模型类型&a…

如何从magento1迁移到magento2

m2相较m1 变化可以说非常大,相当于从头到位都改写一遍,更现代化,更优雅。除了数据库表变化不是很大。 主要迁移的内容有: 1,主题 2,插件(自己开发的或者第三方插件) 3,数据库 主题 不能迁移到m…

STM32上实现spwm调制原理分析

在STM32微控制器上实现SPWM(正弦脉宽调制,Sinusoidal Pulse Width Modulation)调制的核心是利用高频载波(三角波)与低频基波(正弦波)作比较得出。 那么在STM32里三角波和正弦波分别是什么&…

java实现分类下拉树,点击时对应搜索---后端逻辑

一直想做分类下拉,然后选择后搜索的页面,正好做项目有了明确的需求,查找后发现el-tree的构件可满足需求,数据要求为:{ id:1, label:name, childer:[……] }形式的,于是乎,开搞! 一…

Golang | Leetcode Golang题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; const L 10 var bin map[byte]int{A: 0, C: 1, G: 2, T: 3}func findRepeatedDnaSequences(s string) (ans []string) {n : len(s)if n < L {return}x : 0for _, ch : range s[:L-1] {x x<<2 | bin[byte(ch)]}cnt : map[int]in…

文件创建与查看

touch touch命令用于创建一个新的文件。 语法&#xff1a;touch Linux路径 其中路径可以是相对路径、绝对路径或者特殊路径符都可以。 改图展示了通过 touch test.txt 命令创建了一个 test.txt文件&#xff0c;其中深色的代表文件夹&#xff0c;白色的代表文件。 使用 ls -lh…

[MYSQL] 数据库基础

1.什么是数据库 从数据库的名字可以看出,它是用来操作(增删查改....)数据的,事实上也的确如此,通过数据库,我们可以更方便.更高效的来操作.管理数据 以文件形式存储数据的缺点 文件的安全问题文件不利于数据的查询和删除文件不利于存储海量数据操作文件并不方便 为了解决上述问…