day3 链表(一)

2023.12.1
代码随想录刷题Day3

1. 203移除链表元素
对于链表的各种操作备考时也是烂熟于心,这么长时间没写过相关代码,也确实忘了很多,关于移除链表元素,逻辑其实很简单,主要还是看对指针的使用是否熟悉,其次就是最关键的,头节点的使用,我个人是比较习惯加头节点,头节点可以使得对链表的操作全部统一,不用特殊特殊某个节点很方便。思路很简单,加入头节点后遍历一遍链表节点值,如果是要删除的值,直接将上节点的next连接到要删除节点的next就行,也就是越过要删除的节点。再把要删除的节点delete。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {ListNode* temp = new ListNode;ListNode*cur = temp;temp->next = head;while(cur->next!=NULL){if(cur->next->val==val){cur->next = cur->next->next;}elsecur= cur->next;}head = temp->next;delete temp;return head;}
};

2. 707设计链表
这道题逻辑很简单,但就是很考察指针基本功,刚开始写的时候出现了一些指针地址错误,改了很多次,代码这东西还得多写,不然长时间不写真的会生疏,最后有个情况,测试用例过了,但提交失败,有错误的情况,发现是get函数有问题,最后通过打印链表长度,发现是addindex这个函数全部插入失败了,原因是开始的index合法判断有问题。原本这里用了和get函数一样的index判断。并没有多想,但最后出错才发现,两个逻辑不一样,get函数不允许两个端点的index,而addindex却允许有两边的。一个简单的例子:现在有三个节点,索引是0,1,2。此时如果想get索引为3的,则应该报错。因为并没有索引3,但是如果想要给索引3加节点,应该是允许的,因为索引3跟原链表是相连的,这就是我开始犯的错误,没有注意到这一点。最终整体感受,这道题对于常写链表代码的人来说。应该会很简单。但对于很长时间没写过链表代码的人来说,比如我,还是有些复杂的,逻辑简单,实现有些生疏了。

class MyLinkedList {public:struct ListNode{int val;ListNode* next;ListNode(int val):val(val),next(nullptr){}};MyLinkedList() {head = new ListNode(0);size=0; }int get(int index) {cout<<this->size<<endl;if(index > (size-1) || index<0){return -1;}else{int now_index=0;ListNode*node = new ListNode(0);node = head->next;while(now_index<index){node = node->next;now_index++;}return node->val;}cout<<this->size<<endl;}void addAtHead(int val) {ListNode *node = new ListNode(val);node->next = head->next;head->next = node;size++;cout<<this->size<<endl;}void addAtTail(int val) {ListNode*node = new ListNode(val);ListNode*temp = head;while(temp->next != nullptr){temp = temp->next;} temp->next = node;size++;cout<<this->size<<endl;}void addAtIndex(int index, int val) {if(index > size) return;if(index < 0) index = 0;   int now_index = 0;ListNode*node = new ListNode(val);ListNode*temp = new ListNode(0);temp = head;while(now_index<index){temp = temp->next;now_index++;}node->next = temp->next;temp->next = node;size++;cout<<this->size<<endl;}void deleteAtIndex(int index) {if(index>size-1)return;int now_index = 0;ListNode*node = new ListNode(0);node = head;while(now_index<index){node = node->next;now_index++;}node->next = node->next->next;size--;}
private:int size;//记录链表实际长度(除头节点外)ListNode* head;
};/*** Your MyLinkedList object will be instantiated and called as such:* MyLinkedList* obj = new MyLinkedList();* int param_1 = obj->get(index);* obj->addAtHead(val);* obj->addAtTail(val);* obj->addAtIndex(index,val);* obj->deleteAtIndex(index);*/

3. 206反转链表
这道题好像是链表的典型题,很多面试、链表操作中都会有反转链表的题。具体实现也是有两种方法,第一种很简单,遍历连边,将值重新赋予一个新链表就行,最后的新链表就是反转后的链表。当然我们需要掌握的是第二种,在原链表的基础上反转,这种方法逻辑还是有点抽象的,同样是循环,每次需要在节点处断开,前面待处理的原链表,后面是已经反转过的,所以,肯定需要三个指针,一个用来遍历,一个用来记录待处理的链表,一个指向已经处理后的反转链表。最后将已经处理后的反转链表返回即可,对于链表的循环,我记得有个很重要的点就是,每次循环的操作顺序,一定要先记录下一个节点的位置,不然更新当前节点的next后则会丢失原本的next,在我印象中所有链表操作中这点很重要

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* reverseList(ListNode* head) {ListNode* temp = nullptr;  //反转后的ListNode* node = head;  //遍历用的ListNode* n_node;  //待处理的while(node){n_node = node->next; //一定优先记录待处理的部分,也就是该节点指向当前遍历节点的nextnode->next = temp; //进行翻转。当前节点next指向反转后的链表,也就是拼接temp = node;  //更新反转节点的头,上一步已经连接的,这一步就要把头更新为新节点node = n_node;  //往前循环}return temp; //最后返回反转链表即可}
};

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

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

相关文章

M365 E5 eDiscovery Audit产品介绍部署方案

目录 一、M365 E5 eDiscovery & Audit 产品介绍 1. 功能介绍 2. 产品优势 3. 应用场景

Springboot项目启动成功后可通过五种方式继续执行

实现CommandLineRunner接口 项目初始化完毕后&#xff0c;才会调用方法&#xff0c;提供服务 Component public class StartRunner implements CommandLineRunner {Overridepublic void run(String... args) throws Exception {System.out.println("CommandLineRunner&qu…

【SpringBoot3+Vue3】七【后续2】【番外篇】- (使用docke部署)

目录 一、maven打包后端服务 1、clean 2、package 3、查看jar包 二、部署java后端服务 1、使用dockerfile构建一个java17的镜像 1.1 使用dokcerfile构建容器命令 1.2 方式一 将jar打包进容器镜像 1.3 方式二 jar不打包进容器镜像&#xff0c;通过映射主机目录映射方式…

mysql 查询提取json 并去除双引号

1.建表语句 CREATE TABLE uset_test_demo (id bigint(20) NOT NULL AUTO_INCREMENT,context text,PRIMARY KEY (id) ) ENGINEInnoDB AUTO_INCREMENT4 DEFAULT CHARSETutf8;2.源数据 {"title": "Harry Potter","author": "J.K. Rowling&qu…

js实现一个可指定超时时间的异步函数重试机制

好的&#xff0c;这里提供一种可指定超时时间的异步函数重试机制的实现方式&#xff1a; async function retryWithTimeout(asyncFn, maxRetries 3, timeout 1000) {let retries 0;while (retries < maxRetries) {try {const result await Promise.race([asyncFn(), ti…

【sql】【mysql】【数据库】复杂查询中避免Join的办法

【背景】 很多场景下&#xff0c;需要将长表根据不同的搜索条件GroupBy之后变成横向的短表&#xff0c;例如&#xff1a; 分公司收益年份a1002022b2002022c3002022a4002021b5002021c6002021 想要变化为&#xff1a; 分公司2022收益2021收益a100400b200500c300600 笨办法是…

Linux基础项目开发1:量产工具——文字系统(四)

前言&#xff1a; 前面我们已经把显示系统&#xff0c;输入系统的框架搭建好了&#xff0c;那么有了输入和显示&#xff0c;显示的内容应该是什么呢&#xff1f;这节就要让我们一起对显示的内容&#xff0c;文字系统进行搭建。 目录 一、数据结构抽象 1.描述一个文字的位图&a…

ubuntu系统下搭建本地物联网mqtt服务器的步骤

那么假如我们需要做一些终端设备&#xff0c;例如温湿度传感器、光照等物联网采集设备要接入呢&#xff1f;怎么样才能将数据报送到服务器呢&#xff1f; 以下内容基于我们ubuntu系统下的emqx成功启动的基础上。我们可以用浏览器键入控制板的地址&#xff0c;如果启动成功&…

特征相关性计较

Pearson相关系数 用于度量两个连续型变量之间的线性关系。取值范围在-1到1之间&#xff0c;0表示无线性关系&#xff0c;1表示完全正相关&#xff0c;-1表示完全负相关 import pandas as pd# 创建一个包含两个连续型变量的DataFrame data {Variable1: [1, 2, 3, 4, 5],Vari…

软件测试的测试文档怎么编写?

编写软件测试文档是一个关键步骤&#xff0c;它可以帮助测试人员记录测试过程、结果和发现的问题&#xff0c;同时为开发团队提供反馈和建议。 以下是一些编写软件测试文档的建议&#xff1a; 测试计划 在测试计划中&#xff0c;描述测试的目标、范围、方法、时间表和资源需求。…

SQL语句

DDL&#xff1a;数据库定义语言&#xff08;库、表的管理&#xff09; CREATE,DROP,ALTER mysql> show databases; -------------------- | Database | -------------------- | information_schema | ###虚拟库&#xff0c;用户信息 | mysql | …

iOS简单理解区分MVC、MVP、MVVM

MVC、MVP、MVVM 前言 这篇文章简单介绍MVC、MVP和MVVM三种架构&#xff0c;并配上一个简单的Swift demo来区分MVC和MVVM两种架构。 MVC 传统MVC 下图是传统结构MVC&#xff0c;可以看到这种结构是紧耦合的&#xff0c;不推荐使用。 苹果的MVC 如下图&#xff0c;这是苹果…

AI产业前瞻报告:探讨GPTs背后的产业逻辑:拉开AIGC应用生态的帷幕

今天分享的是AI系列深度研究报告&#xff1a;《AI产业前瞻报告&#xff1a;探讨GPTs背后的产业逻辑&#xff1a;拉开AIGC应用生态的帷幕》。 &#xff08;报告出品方&#xff1a;光大证券&#xff09; 报告共计&#xff1a;13页 1、GPTs 拉开 AIGC 应用生态的帷幕 1.1、 Ope…

【开题报告】基于SpringBoot的护肤交流分享平台的设计与实现

1.选题背景 随着社会发展和生活水平提高&#xff0c;人们对于美容护肤的需求越来越高。由于护肤知识需要不断更新和积累&#xff0c;很多用户需要寻找可信赖的护肤信息和经验分享。传统的社交媒体平台虽然可以满足一部分用户的需求&#xff0c;但是缺乏专业性和可靠性&#xf…

系列二十二、各种注解

一、Import # 用法 1&#xff09;Import(User.class)&#xff1a;如果导入的是配置类&#xff0c;将会按照配置类正常解析&#xff0c;如果是个普通类就会解析成bean 2&#xff09;Import&#xff08;实现了ImportSelector接口的类.class&#xff09;&#xff1a;可以一次性注册…

Python爬虫基础之Scrapy框架详解

目录 1. 简介2. Scrapy的安装3. Scrapy的架构4. Scrapy的数据流程5. Scrapy开发流程5.1 创建项目5.2 创建Spider5.3 创建Item5.4 编写Spider5.5 运行Spider 参考文献 原文地址&#xff1a;https://program-park.top/2023/12/01/reptile_5/ 本文章中所有内容仅供学习交流使用&am…

0Ω电阻最大过流能力及作用用途

0Ω电阻最大过流能力及作用用途 0Ω电阻过流能力0Ω电阻的作用 0Ω电阻过流能力 0Ω电阻不一定是真正的0Ω电阻&#xff0c;0Ω电阻存在一定的阻值偏差&#xff0c;主要看生产电阻厂商做哪种了。厂商都是根据电阻标准文件 EN60115-2&#xff0c; 里头0Ω电阻实际最大阻值有 10…

第六十四周周报

学习目标&#xff1a; 项目 实验 学习时间&#xff1a; 2023.11.24-2023.12.1 学习产出&#xff1a; 项目 由于小程序要上线了&#xff0c;这周前几天都在和前端联调改bug&#xff0c;并且多拆分出来两张表&#xff0c;工作量比较大&#xff0c;花的时间很多。 实验 整…

JAVA全栈开发 day15_集合(Set接口、增强For循环、Map体系)

一、增加for遍历集合 语法&#xff1a; for(数据类型 变量名: 数组名或集合){​ }//集合遍历 &#xff0c;推荐使用增加for 1.静态导入 注意事项&#xff1a; 方法必须是静态注意不要和本类的方法同名&#xff0c;如果同名&#xff0c;记得加前缀&#xff0c;由此可…

error: flexible array member not at end of struct 柔性数组/可变数组

在C之中&#xff0c;给定了一个结构定义和一个指向结构的指针&#xff0c;编译器必须能够通过指针偏移的方式访问该结构的任何成员。由于结构中每个成员的位置都取决于其前导成员的数量和类型&#xff0c;因此访问任何结构都需要知道所有前导成员的数量和类型。 在结构体之中&…