数据结构链表力扣例题AC(2)——代码以及思路记录

news/发布时间2024/5/19 11:13:25

206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

AC方法1

struct ListNode* reverseList(struct ListNode* head) {if(head == NULL)return NULL;struct ListNode* n1, *n2, *n3;n1 = NULL;n2 = head;n3 = head->next;while(n2){n2->next = n1;n1 = n2;n2 = n3;if(n3){n3 = n3->next;}}return n1;
}

代码思路

观察示例,1->2->3->4->5 ==>> 5->4->3->2->1

要将箭头的方向都旋转,假设从左向右改变,第一步2->1,用两个指针 n1 和 n2 分别指向1和2,使 n2 指向 n1 就可以实现了,但是此时由于 2 之前保存的 3 的地址,现在保存了 1 的地址,3 的地址丢失了,因此在实现变换前,需要先将交换的两个数字后面一位的地址也保存下来,预防这种情况的发生。因为链表的末尾是指向NULL的,因此第一个也需要变为指向NULL,所以第一步将三个指针设置为 n1 = NULL, n2 = head,n3 = head->next。考虑结束条件,如果是 n3 指向空的话,此时 n2 刚指向最后一个元素,最后一个元素依然指向NULL,因此结束条件设置为 n2 指向空更合适。改变链表方向时,将 n2 指向 n1 (n2->next = n1,改变了箭头方向),再将 n1 、n2 和 n3 向前移动(n1 = n2;n2 = n3),但是这里要考虑 n3 向前移动的特殊情况,因为结束条件是 n2 指向空(说明箭头方向都已经完成变换),但是 n2 移动到NULL之前,n3 会先指向NULL,当 n2 指向 NULL的时候,n3也跟着移动就会发生错误(NULL->next是绝对错误的),因此加一个判断,当 n3 已经为空的时候就不移动了。此时原来的最后一个元素是第一个元素,也就是该链表的地址,n1 指向他,返回 n1 地址即可。

AC方法2

struct ListNode* cur, *newhead;cur = head;newhead = NULL;while(cur){struct ListNode* next = cur->next;cur->next = newhead;newhead = cur;cur = next;}return newhead;

代码思路

联想一下栈的原理,进栈和出栈是不是就顺序相反,因此可以创建一个新的空链表,从原链表第一个节点开始加入新链表,因此需要将头结点的下一个节点存储(因为头结点会保存新链表的节点地址),创建cur指向头结点,新链表由于是空,指向NULL;接着开始向新链表添加,先创建一个新指针保存cur的下一个节点(next = cur->next),然后将原链表第一个移动到新链表里面进行头插(cur->next = newhead,这一步就是相当于头插),然后更新了新链表的头结点后,对应的指向头结点的指针newhead移动指向新的头结点(newhead = cur;)cur回到原链表,指向next保存的新节点。由于cur是添加到新链表以后再回到原链表,因此当cur指向NULL的时候就可以停止了,因此作为while循环条件,最后返回新链表的头结点地址就是变换了顺序的链表的地址了。

链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。

AC

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {// write code herestruct ListNode* fast = pListHead;struct ListNode* slow = pListHead;for(int i = 0; i < k; i++){if(fast == NULL){return NULL;}fast = fast->next;}while(fast){fast = fast->next;slow = slow->next;}return slow;
}

代码思路

这道题用快慢指针的方法就非常妙,先简单说说一般思路:先创建一个指针将链表遍历一遍得出链表长度,再用链表长度减去 k 得出正数是第几个,然后输出正数的节点。

但如果使用快慢指针:fast 指针和 slow 指针最开始都指向头结点,先让 fast 指针走 k 个节点,此时 fast 指针和 slow 指针间就有 k 个节点距离,接着让 fast 和 slow 指针同时向前走,这个过程中两个指针之间始终保持着 k 个距离,因此当 fast 指针走到最后的时候,slow 指针正好处于倒数第 k 个。不过有特殊情况需要考虑,就是如果 k 大于了链表节点数,结果是输出空指针,因此在 fast 移动的时候就去检验他会不会等于空,如果 fast 等于空了直接 return NULL,因为k大于链表节点数,那么 i 还没有大于等于 k ,fast 就已经变为 NULL 了。其次还有 k=0 的情况,这时候进不去 for 循环,但是可以进去 while 循环,也就是快慢指针同时走了,fast=NULL 的时候 slow 也为 NULL 了,最后返回 slow 也就是返回空了。

这道题只写快慢指针的方法,有兴趣的实现第一种简单思想的,以练算法为主就不暴力了

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

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

相关文章

ChatGPT绘图指南:DALL.E3玩法大全(一)

一、 DALLE.3 模型介绍 1、什么是 DALLE.3 模型&#xff1f; DALLE-3模型&#xff0c;是一种由OpenAI研发的技术&#xff0c;它是一种先进的生成模型&#xff0c;可以将文字描述转化为清晰的图片。这种模型的名称"DALLE"实际上是"Deep Auto-regressive Latent …

unity学习(26)——客户端与服务器合力完成注册功能(8)json编解码问题,大结局

服务器端发送的内容如下&#xff1a; 客户端所接受的内容如下&#xff1a; 是一样的&#xff0c;不是传输问题&#xff0c;少了一个解码的过程&#xff0c;之前那个addMessage函数应该是不能解码的&#xff01; 具体解析一下数据包的内容&#xff1a;上边的是成功的&#xff0…

OpenCV边缘检测与视频读写

原理 OpenCV中的边缘检测原理主要基于图像梯度的计算&#xff0c;包括一阶梯度和二阶梯度。 一阶梯度&#xff1a;它反映了图像亮度变化的速度。Sobel算法就是一种以一阶梯度为基础的边缘检测算法。它通过计算图像在水平和垂直方向上的梯度来检测边缘。这种方法简单有效&…

python 与 neo4j 交互(py2neo 使用)

参考自&#xff1a;neo4j的python.py2neo操作入门 官方文档&#xff1a;The Py2neo Handbook — py2neo 2021.1 安装&#xff1a;pip install py2neo -i https://pypi.tuna.tsinghua.edu.cn/simple 1 节点 / 关系 / 属性 / 路径 节点(Node)和关系(relationship)是构成图的基础…

ElasticSearch之Index Template 和Dynamic Template

写在前面 在ElasticSearch之Mapping 一文中我们一起看了es的dynamic mapping机制&#xff0c;通过该机制允许我们不需要显式的定义mapping信息&#xff0c;而是es根据插入的文档值来自动生成 &#xff0c;比如插入如下的文档&#xff1a; {"firstName": "Chan…

Spring Boot 笔记 023 注册页面

1.1 request.js请求工具 //定制请求的实例//导入axios npm install axios import axios from axios; //定义一个变量,记录公共的前缀 , baseURL const baseURL /api; const instance axios.create({baseURL})//添加响应拦截器 instance.interceptors.response.use(result…

QT-地形3D

QT-地形3D 一、 演示效果二、关键程序三、下载链接 一、 演示效果 二、关键程序 #include "ShaderProgram.h"namespace t3d::core {void ShaderProgram::init() {initializeOpenGLFunctions();loadShaders(); }void ShaderProgram::addShader(const QString &fil…

js设计模式:适配器模式

作用: 可以将某种不同格式的数据转化为自己所期待的数据格式 或者对于一些存在兼容或者特殊处理的业务逻辑,可以进行一个适配 示例: //原始数据let oldData1 [{name: 王惊涛,age: 29},{name: 孙悟空,age: 800},{name: 嘉文四世,age: 27},{name: 关羽,age: 40},{name: 伊利丹…

无人机概述及系统组成,无人机系统的构成

无人机的定义 无人驾驶航空器&#xff0c;是一架由遥控站管理&#xff08;包括远程操纵或自主飞行&#xff09;的航空器&#xff0c;也称遥控驾驶航空器&#xff0c;以下简称无人机。 无人机系统的定义 无人机系统&#xff0c;也称无人驾驶航空器系统&#xff0c;是指一架无人…

【力扣白嫖日记】1873.计算特殊奖金

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 1873.计算特殊奖金 表&#xff1a;Employees 列名类型employee_idintnamevarcharsalaryint employee_id 是…

Mysql如何优化数据查询方案

mysql做读写分离 读写分离是提高mysql并发的首选方案。 Mysql主从复制的原理 mysql的主从复制依赖于binlog&#xff0c;也就是记录mysql上的所有变化并以二进制的形式保存在磁盘上&#xff0c;复制的过程就是将binlog中的数据从主库传输到从库上。 主从复制过程详细分为3个阶段…

相机图像质量研究(19)常见问题总结:CMOS期间对成像的影响--Sensor Noise

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

spring-security 过滤器

spring-security过滤器 版本信息过滤器配置过滤器配置相关类图过滤器加载过程创建 HttpSecurity Bean 对象创建过滤器 过滤器作用ExceptionTranslationFilter 自定义过滤器 本章介绍 spring-security 过滤器配置类 HttpSecurity&#xff0c;过滤器加载过程&#xff0c;自定义过…

备战蓝桥杯 Day5

1191&#xff1a;流感传染 【题目描述】 有一批易感人群住在网格状的宿舍区内&#xff0c;宿舍区为n*n的矩阵&#xff0c;每个格点为一个房间&#xff0c;房间里可能住人&#xff0c;也可能空着。在第一天&#xff0c;有些房间里的人得了流感&#xff0c;以后每天&#xff0c;得…

相机图像质量研究(27)常见问题总结:补光灯以及遮光罩对成像的影响--遮光罩

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

4 月 9 日至 4 月 10 日,Hack.Summit() 2024 首聚香江

Hack.Summit() 是一系列 Web3 开发者大会。2024 年的活动将于 2024 年 4 月 9 日至 4 月 10 日在香港数码港举行。自十年前首次举办以来&#xff0c;此次会议标志着 Hack.Summit() 首次在亚洲举办&#xff0c;香港被选为首次亚洲主办城市&#xff0c;这对 Hack VC 和该地区都具…

windows 下跑起大模型(llama)操作笔记

原贴地址&#xff1a;https://testerhome.com/topics/39091 前言 国内访问 chatgpt 太麻烦了&#xff0c;还是本地自己搭一个比较快&#xff0c;也方便后续修改微调啥的。 之前 llama 刚出来的时候在 mac 上试了下&#xff0c;也在 windows 上用 conda 折腾过&#xff0c;环…

计算机网络——11EMail

EMail 电子邮件&#xff08;EMail&#xff09; 3个主要组成部分 用户代理邮件服务器简单邮件传输协议&#xff1a;SMTP 用户代理 又名“邮件阅读器”撰写、编辑和阅读邮件输入和输出邮件保存在服务器上 邮件服务器 邮箱中管理和维护发送给用户的邮件输出报文队列保持待发…

手写myscrapy(二)

我们看一下scrapy的系统架构设计方法和思路&#xff1a; 模块化设计&#xff1a; Scrapy采用模块化设计&#xff0c;将整个系统划分为多个独立的模块&#xff0c;包括引擎&#xff08;Engine&#xff09;、调度器&#xff08;Scheduler&#xff09;、下载器&#xff08;Downl…

Linux常见基本指令

本文将详细的介绍Linux中各常见指令的用法&#xff0c;并且在每个指令都有使用样例。一共有以下指令&#xff1a; 1. man指令 2.目录基础指令&#xff1a;2.1 pwd指令、2.2 ls指令、2.3 cd指令 3.文件创建与删除&#xff1a;3.1 touch指令、3.2 mkdir指令、3.3 rmdir 指令 &…
推荐文章