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

leetcode链表

在这里插入图片描述
这几天手的骨裂稍微好一点了,但是还是很疼,最近学校的课是真多,我都没时间做自己的事,但是好在今天下午是没有课的,我也终于可以做自己的事情了。

今天分享几道题目

移除链表元素

这道题我们将以两种方法开解决,但是我觉得从总体思路上来讲,都可以称为双指针,第一个就是我们在我们原链表上进行修改,我们和之前顺序表的一个题目很是相似,就是我们遇到val就删除,那因为是链表,我们可以理解为释放它这个当前的空间,然后进行当前位置的前一个和后以一个位置的链接就行。

在这里插入图片描述

我们给两个指针,然后cur的作用就是进行遍历,我们的prev这个指针就是找到它当前位置的前一个位置,因为我们要删除当前的位置,如果没有前面这个前驱指针,我们删除当前位置之后,前一个和后一个就链接不上了。

struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* prev = NULL;struct ListNode* cur = head;while(cur){if(cur->val == val){if(prev == NULL){head = head->next;cur = cur->next;}else{struct ListNode* tmp = cur;cur = cur->next;free(tmp);prev->next = cur;}}else{prev = cur;cur = cur->next;}}return head;
}

这个就是我们这道题的一个解决方法,还有就是利用单链表的尾插思想,我们重新搞一个链表,然后进行前后链接。

struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* newhead = NULL, *tail = NULL;struct ListNode* cur = head;while(cur){if(cur->val == val){cur = cur->next;}else{if(newhead == NULL){newhead = cur;tail = newhead;}else{tail->next = cur;tail = tail ->next;}cur =  cur->next;}}if(tail)tail->next = NULL;return newhead;
}

这个就是我们的另一种方法,其实就是一个尾插,大家仔细画图就能解决。
在这里插入图片描述
就是我们如果没遇到val,就拿下来,上面一个cur指针来遍历原来的链表,下面的指针来遍历新的链表,这里我觉得大家不理解的地方,可能是为什么我们的tail还要指向空,这里我来解释一下,如果我们的链表尾节点的值也是val,这个时候如果我们不进行处理的话,tail的next是尾节点,所以要判断一下。
反转链表

这个题目我们也有两种做法,第一种就是我们把箭头方向换一下就行了。
在这里插入图片描述
我们可以个三个指针。
在这里插入图片描述
可以看到我们给三个指针,第一指针n1的作用就是让n2指向它,这样我们的箭头方向就是已经换过,但是不仅仅是这样,假设我们换第一个n2指向空的时候,n2后面节点的位置就是不知道的,所以我们这里不能这样做,我们的先用一个next的指针来保存后面的位置,这里才能找到写一个地址的节点。

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

这个就是我们这道题目的答案,我么这里其实需要注意两点,这两点leetcode会提示,第一就是如果一进来就是空的,就需要我们进行判断,第二个就是我们的n3会为空,什么时候为空,大家可以画图加上走读代码来看。
在这里插入图片描述
这里就是我们n3为空的时候,我们加上判断就可以解决了,我们这里还有一个方法就是和单链表是一样,那就是头插。
在这里插入图片描述
感觉下次得搞个录屏的才行,这个样子的动图总是整不上,会有点问题,大家也不好理解我的意思,如果有人看我的文章,觉得这个题目还是有问题,请私聊我
下面是代码

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

链表中间节点
这个题目的思路其实就是快慢指针,一个指针走的快一点,一个指针走的慢一点就可以解决

struct ListNode* middleNode(struct ListNode* head) {struct ListNode* fast = head;struct ListNode* slow = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;}return slow;
}

这里我们需要注意的最重要的一点其实就是我们要注意奇数和偶数项,虽然都可以找到中间项,但是偶数项的时候fast会为空,所以while加个条件就可以了。
寻找第K个节点

这和我们快慢指针其实是一样的,最重要的就是注意有没有越界就OK了

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {struct ListNode*slow=pListHead;struct ListNode*fast=pListHead;while((k--)){if(fast==NULL)return NULL;fast=fast->next;}while(fast){fast=fast->next;slow=slow->next;}return slow;
}

.合并两个有序链表

这个题目我觉得其实就是仔细一点就能解决,还是那句话,我们得多画图,因为这其实就是一个尾插,我们就把两个链表各给一个指针,比较大小,小的拿出来,然后进行尾插到新链表就可以了。
在这里插入图片描述
反正大家就先画图,自己先走一遍,然后再来过就可以很好的解决了,代码我给大家看看。

struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {if(list1 == NULL && list2 == NULL){return NULL;}struct ListNode* cur1 = list1;struct ListNode* cur2 = list2;struct ListNode* newhead = NULL;struct ListNode* tail =NULL;while(cur1 && cur2){if(cur1->val < cur2->val){if(newhead==NULL){newhead = tail = cur1;}else{tail->next = cur1;tail = tail->next;}cur1 = cur1->next;}else{if(newhead==NULL){newhead = tail = cur2;}else{tail->next = cur2;tail = tail->next;}cur2 = cur2->next;}}if(tail == NULL){if(list1)return list1;elsereturn list2;}while(cur1){tail->next = cur1;tail = tail->next;cur1 = cur1->next;}while(cur2){tail->next = cur2;tail = tail->next;cur2 = cur2->next;}return newhead;
}

我觉得我的代码最大的问题就是看起来有点繁琐,但是也都是根据测试用例一个一个去尝试,leetcode用起来个测试用例是真舒服。
😊😊那今天的分享就到这里,我们下次再见。

在这里插入图片描述

相关文章:

leetcode链表

这几天手的骨裂稍微好一点了&#xff0c;但是还是很疼&#xff0c;最近学校的课是真多&#xff0c;我都没时间做自己的事&#xff0c;但是好在今天下午是没有课的&#xff0c;我也终于可以做自己的事情了。 今天分享几道题目 移除链表元素 这道题我们将以两种方法开解决&…...

Kali Linux渗透测试的艺术

Kali Linux&#xff08;Kali&#xff09;是专门用于渗透测试的Linux操作系统&#xff0c;它由BackTrack 发展而来。在整合了IWHAX、WHOPPIX 和Auditor 这3 种渗透测试专用Live Linux 之后&#xff0c;BackTrack正式改名为Kali Linux。 BackTrack是相当著名的Linux发行版本。在…...

2023年最新版潮乎盲盒源码含搭建教程

后台开发语言&#xff1a;后端 Laravel 框架开发 前端开发框架&#xff1a;uniappvue 环境配置: php7.4 mysql5.6 nginx1.22 redis&#xff08;建议宝塔面板或 lnmp&#xff09; 源码获取请自行百度&#xff1a;一生相随博客 一生相随博客致力于分享全网优质资源&#x…...

[GitLab] 安装Git 指定版本

卸载旧版本 检查是否已经安装 git --version如果已经安装&#xff0c;先卸载 yum -y remove git安装新版本 在GitHub上选择需要下载的版本 Git版本 在/usr/local/目录下新建文件夹&#xff1a;git&#xff0c;并在/usr/local/git/文件夹内下载压缩包 wget https://github…...

vue中ref和$refs

1.作用 利用ref 和 $refs 可以用于 获取 dom 元素 或 组件实例&#xff0c;也可以在父组件获取子组件&#xff0c;从而调用子组件的方法。 2.特点&#xff1a; 查找范围 → 当前组件内(更精确稳定) 3.语法 1.给要获取的盒子添加ref属性 <div ref"chartRef"&…...

CRM怎样帮助您的企业进行营销管理?

​ CRM助力企业营销管理&#xff0c;为企业降本增效提升投入产出比。CRM软件是如何实现的呢&#xff1f; 扩大线索量 想要精准获客的第一步是要扩大线索量&#xff0c;多渠道营销推广是很好的方法。例如&#xff1a; 1.线下展会线上Webinar等市场活动 2.搭建微信、微博、…...

Gerrrit 管理员常用命令

1. replication插件重新加载 当修改replication配置文件&#xff08;replication.config&#xff09;&#xff0c;需要重启gerrit生效&#xff0c;或者重新加载replication。 # 重新加载replication插件 ssh -p 29418 usernamegerrit.company.com gerrit plugin reload repli…...

深入理解强化学习——多臂赌博机:增量式实现

分类目录&#xff1a;《深入理解强化学习》总目录 至今我们讨论的动作—价值方法都把动作价值作为观测到的收益的样本均值来估计。下面我们探讨如何才能以一种高效的方式计算这些均值&#xff0c;尤其是如何保持常数级的内存需求和常数级的单时刻计算量。 为了简化标记&#x…...

视频批量混剪剪辑软件类似剪映设计一个模板后, 视频,图片,文字,转场,音频,特效都可以系统随机

随着自媒体时代的到来&#xff0c;越来越多的人加入到了视频创作行列。然而&#xff0c;视频剪辑是一项繁琐的任务&#xff0c;特别是当你需要批量处理多个视频时。为了提高效率&#xff0c;一款名为“视频闪闪”的批量剪辑软件应运而生。 www.shipinshanshan.com “视频闪闪”…...

优维低代码实践:打包发布

导语 优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。…...

js深度学习(三)

循环 var i0 for(;i<10;){ console.log(i) i } while(i<10){ console.log(i) i } var i100; for(;i--;){ console.log(i) }2、引用值 typeof&#xff1a;number string boolean Object(object/array/null出现是为了指定为空对象/)undefined function typeof a >unde…...

JVM类的声明周期

文章目录 版权声明生命周期概述加载阶段查看内存中的对象 连接阶段连接阶段之验证连接阶段之准备连接阶段之解析 初始化阶段练习题目一练习题目二练习题目三练习题目四 使用阶段卸载阶段总结 版权声明 本博客的内容基于我个人学习黑马程序员课程的学习笔记整理而成。我特此声明…...

html将复选框变为圆形样例

html将复选框变为圆形样例 说明目录使用对勾图标实现圆形复选框原复选框html代码及默认样式取消复选框未勾选前的样式新增复选框未勾选前的样式新增复选框勾选后的样式获取复选框选中后的value值 使用CSS样式写对勾图标实现圆形复选框 说明 这里记录下用原生html实现将原复选框…...

笔记软件 Keep It mac v2.3.3中文版新增功能

Keep It mac是一款专为 Mac、iPad 和 iPhone 设计的笔记和信息管理应用程序。它允许用户在一个地方组织和管理他们的笔记、网络链接、PDF、图像和其他类型的内容。Keep It 还具有标记、搜索、突出显示、编辑和跨设备同步功能。 Keep It for mac更新日志 修复了更改注释或富文本…...

uni-app 开发的H5 定位功能部署注意事项

一、H5部署的时候&#xff0c;如果设计到定位功能&#xff0c;需要注意以下几点 1、打包部署的时候需要在Web配置-定位和地图里面勾选一个地图&#xff0c;并配置key 2、打包部署需要域名是https协议的&#xff0c;大多数现代浏览器要求在HTTPS协议下才能够访问地理位置信息&a…...

CY5-COOH脂溶性羧基荧光染料1032678-07-1

Cyanine5-COOH是一种荧光染料&#xff0c;它CAS号1032678-07-1&#xff0c;分子式为C32H39ClN2O2&#xff0c;分子量为519.12。Cyanine5-COOH具有良好的光稳定性和荧光亮度&#xff0c;可以用于生物学研究、诊断、药物筛选等领域。 Cy5-COOH (来自星戈瑞的花菁染料) 含有羧基官…...

【CSS】div 盒子居中的常用方法

<body><div class"main"><div class"box"></div></div> </body>绝对定位加 margin: auto; &#xff1a; <style>* {padding: 0;margin: 0;}.main {width: 400px;height: 400px;border: 2px solid #000;positio…...

Pytorch网络模型训练

现有网络模型的使用与修改 vgg16_false torchvision.models.vgg16(pretrainedFalse) # 加载一个未预训练的模型 vgg16_true torchvision.models.vgg16(pretrainedTrue) # 把数据分为了1000个类别print(vgg16_true) 以下是vgg16预训练模型的输出 VGG((features): S…...

webgoat-Path traversal

Path traversal 路径&#xff08;目录&#xff09;遍历是一种漏洞&#xff0c;攻击者能够访问或存储外部的文件和目录 应用程序运行的位置。这可能会导致从其他目录读取文件&#xff0c;如果是文件&#xff0c;则会导致读取文件 上传覆盖关键系统文件。 它是如何工作的&#…...

P8976 「DTOI-4」排列,贪心

题目背景 Update on 2023.2.1&#xff1a;新增一组针对 yuanjiabao 的 Hack 数据&#xff0c;放置于 #21。 Update on 2023.2.2&#xff1a;新增一组针对 CourtesyWei 和 bizhidaojiaosha 的 Hack 数据&#xff0c;放置于 #22。 题目描述 小 L 给你一个偶数 n 和两个整数a,b…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

【安全篇】金刚不坏之身:整合 Spring Security + JWT 实现无状态认证与授权

摘要 本文是《Spring Boot 实战派》系列的第四篇。我们将直面所有 Web 应用都无法回避的核心问题&#xff1a;安全。文章将详细阐述认证&#xff08;Authentication) 与授权&#xff08;Authorization的核心概念&#xff0c;对比传统 Session-Cookie 与现代 JWT&#xff08;JS…...