【代码随想录算法训练Day3】LeetCode 203.移除链表元素、LeetCode 707.设计链表、LeetCode 206.反转链表

Day3 链表

链表也是一种很重要的数据结构,链表的优势是空间不必连续,分配比较自由,缺点是不支持随机访问,想要获取链表中间的某个元素,必须要从头遍历。

LeetCode 203.移除链表元素【虚拟头结点】

移除链表中的某个元素很简单,只需要把这个节点前一个节点的next指针指向这个节点后面一个元素即可。但是头结点是没有前一个节点的,此时我们有两种做法,一种是特判头结点,如果头结点元素满条件,则将头指针不断后移,其余方法不变,另一种方法是创造一个虚拟头结点,让头结点在删除时的特性与其余节点一致,而头结点的前驱就是我们创造的这个dummyhead

解法1:头结点特判

头结点特判有一点需要注意:开头对头结点的判断要用while而不是if,因为头结点之后如果存在连续相等的值,在头结点删除后新的头结点仍满足条件,则需要全部删除。

class Solution {
public:ListNode* removeElements(ListNode* head, int val) {while(head!=NULL && head->val==val){ListNode* tmp=head;head=head->next;delete tmp;}ListNode* cur=head;while(cur!=NULL && cur->next!=NULL){if(cur->next->val==val){ListNode* tmp=cur->next;cur->next=cur->next->next;delete tmp;}else cur=cur->next;}return head;}
};

解法2:虚拟头结点

这里是我的写法,其实需要在中间的判断中用临时变量获取p->next,然后delete掉,清理内存,这里没有写,以后删除需要养成良好的习惯。

class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummy=new ListNode(0,head);ListNode* p=dummy;while(p->next!=NULL){if(p->next->val==val){p->next=p->next->next;}else p=p->next;}return dummy->next;}
};

LeetCode 707.设计链表【链表基础】

最考验基本功的一集,如果你仍然对链表操作有疑问,那么请回到这一题,它能解答你对所有链表基本操作的疑问。
这道题我在一开始做的时候用了数组模拟链表逃课AC了,如果题目并没有强制要求用严格的链表结构实现,有时候可以用数组模拟,这样相当于用空间换了代码复杂度。

解法1:数组模拟

class MyLinkedList {
public:int head,e[1010],ne[1010],idx,siz;MyLinkedList() {head=-1;idx=0;siz=0;}int get(int index) {if(index>=siz || index<0)return -1;int i=head;while(index--) i=ne[i];return e[i];}void addAtHead(int val) {e[idx]=val;ne[idx]=head;head=idx++;siz++;}void addAtTail(int val) {addAtIndex(siz,val);}void addAtIndex(int index, int val) {if(index>siz) return;if(index<=0){addAtHead(val);return;}int i=head;while(--index) i=ne[i];e[idx]=val;ne[idx]=ne[i];ne[i]=idx++;siz++;}void deleteAtIndex(int index) {if(index>=siz || index<0) return;if(index==0){head=ne[head];siz--;return;}int i=head;while(--index) i=ne[i];ne[i]=ne[ne[i]];siz--;}
};

解法2:链表结构

如果向上一题一样,题目已经要求使用链表结构,那就不能投机取巧了,要把基本操作好好了解一下。

class MyLinkedList {
public:struct LinkedNode{int val;LinkedNode* next;LinkedNode(int val):val(val),next(nullptr){}};MyLinkedList() {dummyHead=new LinkedNode(0);siz=0;  }int get(int index) {if(index>(siz-1) || index<0) return -1;LinkedNode* cur=dummyHead->next;while(index--) cur=cur->next;return cur->val;}void addAtHead(int val) {LinkedNode* newNode=new LinkedNode(val);newNode->next=dummyHead->next;dummyHead->next=newNode;siz++;}void addAtTail(int val) {LinkedNode* newNode=new LinkedNode(val);LinkedNode* cur=dummyHead;while(cur->next!=NULL) cur=cur->next;cur->next=newNode;siz++;}void addAtIndex(int index, int val) {if(index>siz) return;if(index<0) index=0;LinkedNode* newNode=new LinkedNode(val);LinkedNode* cur=dummyHead;while(index--) cur=cur->next;newNode->next=cur->next;cur->next=newNode;siz++;}void deleteAtIndex(int index) {if(index>=siz || index<0) return;LinkedNode* cur=dummyHead;while(index--) cur=cur->next;LinkedNode* tmp=cur->next;cur->next=cur->next->next;delete tmp;siz--;}private:int siz;LinkedNode* dummyHead;
};

LeetCode 206.反转链表【双指针/递归】

反转链表也是一个非常经典的问题,它要求我们每走一步就要改变两个节点之间next指针的位置,这里有双指针法和递归法两种,得好好研究一下。

解法1:双指针

双指针解法是想法比较基础的解法,就是用一前一后两个指针,把后面的指针转到前面来。
细节:第一步cur移动前要用tmp保存cur->next,否则会丢失下一节点。
每次移动指针时,先动pre,再动cur,否则两个指针会断连。

class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* cur=head;ListNode* pre=NULL;ListNode* tmp;while(cur){tmp=cur->next;cur->next=pre;pre=cur;cur=tmp;}return pre;}
};

解法2:递归

递归解法的本质还是双指针算法,只不过把双指针向前移动的过程转化为reverse函数中替换形参的过程,不过代码确实很简洁,当做思维扩展学了。

class Solution {
public:ListNode* reverse(ListNode* cur,ListNode* pre){if(cur==NULL) return pre;ListNode* tmp=cur->next;cur->next=pre;return reverse(tmp,cur);}ListNode* reverseList(ListNode* head) {return reverse(head,NULL);}
};

今日收获很多啊,对链表的理解更深了。

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

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

相关文章

【图文教程】PyCharm安装配置PyQt5+QtDesigner+PyUic+PyRcc

这里写目录标题 PyQt5、Qt Designer、PyUic、PyRcc简介&#xff08;1&#xff09;下载安装PyQt5&#xff08;2&#xff09;打开designer.exe所在位置&#xff08;3&#xff09;在PyCharm中配置QtDesigner&#xff08;4&#xff09;验证QtDesigner是否配置成功&#xff08;5&…

通过编写dockerfile部署python项目

docker命令总览 docker通过dockerfile构建镜像常用命令 # 创建镜像&#xff08;进入dockerfile所在的路径&#xff09; docker build -t my_image:1.0 .# 查看镜像 docker images# 创建容器 docker run -dit --restartalways -p 9700:9700 --name my_container my_image:1.0 #…

阿里发布通义千问2.5:一文带你读懂通义千问!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

就业班 第三阶段(zabbix) 2401--5.9 day1 普通集zabbix 5.0部署 nginx部署+agent部署

文章目录 环境一、zabbix 5.0 部署1、安装yum源2、安装相关软件3、数据库安装和配置mariaDB数据库mysql57数据库 安装mysql万能卸载mysql代码&#xff1a;启动mysql并初始化4、数据表导入5、修改配置&#xff0c;启动服务6、配置 web GUI7、浏览器访问注意数据加密的选项不要勾…

分享四种免费获取SSL的方式

SSL证书目前需要部署安装的网站很多&#xff0c;主要还是基于国内目前对证书的需求度在不断的升高&#xff0c;网站多了、服务器多了之后。网络安全问题就成为了大家不得不面对的一个重要的问题了。SSL证书的作用有很多&#xff0c;这里就不一一详述了&#xff0c;本期作品主要…

RSAC 2024现场:谷歌展望大模型在网络安全领域的前景

人类距离将网络安全的控制权交给生成式AI还有多远&#xff1f; 前情回顾RSAC2024动态 伪造内容鉴别厂商Reality Defender斩获2024 RSAC创新沙盒冠军 RSAC 2024上值得关注的10款网络安全产品 RSAC 2024创新沙盒十强出炉&#xff0c;谁能夺冠&#xff1f; 安全内参5月8日消息…

table表格 如何加卡片 实现?

实现非常简单 代码 const columnsinsu [{dataIndex: nowdate,key: nowdate,render: (text, record) ><Cardhoverablestyle{{width: 97%,height: 90,}}// cover{<img alt"example" src"https://os.alipayobjects.com/rmsportal/QBnOOoLaAfKPirc.png&…

浅析安全用电监控系统在工厂的研究与应用论述

摘 要&#xff1a;随着社会时代的发展&#xff0c;人们的安全意识越来越强烈&#xff0c;在人们生活和工作中离不开各种用电设备&#xff0c;用电设备的安全使用是保障人们生命安全的重要内容。工厂因自身厂内工作环境的特殊性&#xff0c;用电设备的种类多且复杂&#xff0c;如…

指针的奥秘(二):指针与数组的联系+字符指针+二级指针+指针数组+《剑指offer》笔试题

指针 一.指针与数组的联系1.数组名的理解2.使用指针访问数组3.一维数组传参的本质 二.字符指针1.字符指针隐藏秘密2.常量字符串3.《剑指offer》笔试题 三.二级指针四.指针数组1.指针数组模拟二维数组 一.指针与数组的联系 1.数组名的理解 也许大部分人认为数组名就是一个名称&…

TL-WN826N无线网卡连接电脑蓝屏,提示rtl8188gu.sys

TL-WN826N无线网卡插电脑就蓝屏&#xff0c;提示rtl8188gu.sys 处理方法&#xff1a; 设备管理器中卸载其他的2.0无线网卡程序和功能中卸载网卡驱动TPlink官网下载 TL-WN826N V1.0_1.0.0&#xff08;https://www.tp-link.com.cn/product_572.html?vdownload&#xff09;&…

【Linux】项目自动化构建工具make/makefile

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中项目自动化构建工具make/makefile的相关内容。 如果看到最后…

【知识碎片】2024_05_09

本篇记录了关于C语言的一些题目&#xff08;puts&#xff0c;printf函数的返回值&#xff0c;getchar&#xff0c;跳出多重循环&#xff09;&#xff0c;和一道关于位运算的代码&#xff3b;整数转换&#xff3d;。 C语言碎片知识 如下程序的功能是&#xff08; &#xff09; #…

从古代故事中领悟高情商回话

页面 页面代码 <% layout(/layouts/default.html, {title: 故事管理, libs: [dataGrid]}){ %> <div class"main-content"><div class"box box-main"><div class"box-header"><div class"box-title">&l…

FPGA+MCU+SDRAM方案,用于服装厂生产过程中以及设计过程中制作样板,剪裁布料

FPGAMCUSDRAM方案&#xff0c;用于服装厂生产过程中以及设计过程中制作样板&#xff0c;剪裁布料 客户应用&#xff1a;服装厂制衣 主要功能&#xff1a; 1.支持步进电机、直流电机 2.支持同时3轴电机协调工作 3.支持以太网/USB联机控制 4.支持LCD 屏显示状态 5.支持HP11/…

Rust多线程交叉打印+Send Sync特征讲解

导航 Rust多线程交叉打印Send Sync特征讲解 一、Rust多线程交叉打印二、Send Sync 特征讲解 Rust多线程交叉打印Send Sync特征讲解 一、Rust多线程交叉打印 先说背景有两个线程&#xff0c;分别为0号线程和1号线线程两个线程交叉打印共享值&#xff0c;并将共享值1当标志为fa…

制鞋5G智能工厂数字孪生可视化平台,推进行业数字化转型

制鞋5G智能工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。随着科技的飞速发展&#xff0c;5G技术与智能制造的结合正成为推动制鞋行业数字化转型的重要力量。制鞋5G智能工厂数字孪生可视化平台&#xff0c;不仅提高了生产效率&#xff0c;还优化了资源配置&#xff0…

2024.5.9 作业 xyt

1. 创建一对父子进程&#xff1a; 父进程负责向文件中写入 长方形的长和宽 子进程负责读取文件中的长宽信息后&#xff0c;计算长方形的面积 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <…

从0开始linux(2)——热键、如何查阅手册

欢迎来到博主的专栏——从0开始linux 博主ID&#xff1a;代码小豪 博主使用的linux发行版&#xff1a;CentOS 7.6 文章目录 热键[Tab]热键Ctrl cshift[pageup]和[pagedown] 查阅手册\-\-help在线手册maninfo手册 热键 我们的命令行模式中存在很多的组合热键&#xff0c;这些按…

������森林消防泵:特点及使用场景 /恒峰智慧科技������

在大自然的怀抱中&#xff0c;森林是地球上最美丽的绿色家园。然而&#xff0c;森林火灾却时常威胁着这片美丽的家园。为了保护森林&#xff0c;我们有幸拥有了一支强大的森林消防泵队伍。今天&#xff0c;就让我们一起来了解一下这些守护者们的故事吧&#xff01; &#xfffd…

电脑ip地址设置成什么比较好

随着信息技术的快速发展&#xff0c;IP地址已成为电脑在网络世界中的“身份证”。它不仅是电脑在网络中进行通信的基础&#xff0c;也直接关系到网络连接的稳定性、安全性和效率。然而&#xff0c;面对众多IP地址设置选项&#xff0c;许多用户可能会感到困惑。那么&#xff0c;…