【算法篇】--重温算法题

 目录

前言【算

一、反转链表

二、合并两个有序链表

三、反转链表II

四、移除链表元素

前言

本篇文章基于学习了一段数据结构,并练习了几道算法题所做的一些笔记,方便日后复习时可以用到。

如果有什么不对的地方,欢迎大家在评论区指正;

一、反转链表

题目描述:

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

对于这道题,我们只需将原来指向下一位节点反转过来即可,也就是说让5指向4,4再指向3,最后指向1,首先定义三个指针,n1,n2,n3, n2对应头节点,n3指向n2的下一个位置(即n3=n2->next),依次循环遍历,让n2->next指向n1,继续向后移动,n1移动到原来n2位置,n2移动到n3位置,n3继续向前走,直至不为空时结束

图片展示:

代码展示:

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

二、合并两个有序链表

题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

此方法来源一题解网友,在这里主要回顾一下。

首先我们创建新的链表来实现,前面要判断,如果其中一个为空,则返回另一个链表。然后while循环遍历,判断n1 n2指向的list1 list2的头节点哪个小,小的进行尾插,尾插到新链表的后面(即就是让newtail->next指向小的那个), 这里的(n1 &&  n2)意思是一个为空,则跳出循环,最后记得销毁newhead,并返回newhead->next

代码块:

struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {ListNode* n1=list1;ListNode* n2=list2;//创建新链表ListNode* newhead;ListNode* newtail;newhead=newtail=(ListNode*)malloc(sizeof(ListNode));if(list1==NULL){return list2;}if(list2==NULL){return list1;}while(n1 && n2){if(n1->val>=n2->val){newtail->next=n2;n2=n2->next;}else{newtail->next=n1;n1=n1->next;}newtail=newtail->next;}//跳出循环,如果n1先走到空,将n2剩余节点连接到表尾if(n2){newtail->next=n2;}else{newtail->next=n1;}ListNode* ret=newhead->next;free(newhead);newhead=NULL;return ret;
}

三、反转链表II

题目描述:

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

这道题的整体思想如同官方第二种解法:在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。什么意思呢,按示例1来说,2是left,4是right,在2和4区间里(也就是left 和right区间里),走到3这个位置的话,让3这个位置插入到2的前面,再走到4这块,让4插入到3的前面,依次这样,就能实现left和right位置的反转,示例1由于中间较少,可能不好理解,下面这张图更能加深理解。

操作步骤:

先在left(也就是图中的curr)前一位置定义一个pre,再定义个next,让他等于left下一位,执行如下图的操作1,curr->next指向next->next,再让next->next指向pre->next(操作2),最后让pre->next指向next(操作3)。这样就完成了。

代码演示:

 struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* reverseBetween(struct ListNode* head, int left, int right) {ListNode* dump=(ListNode*)malloc(sizeof(ListNode));dump->val=-1;dump->next=head;ListNode* pre=dump;//持续遍历pre,使得它到left前一个位置for(int i=0;i<left-1;i++){pre=pre->next;}ListNode* cur=pre->next;ListNode* next;for(int i=0;i<right-left;i++){next=cur->next;cur->next=next->next;next->next=pre->next;pre->next=next;}return dump->next;
}

四、移除链表元素

题目描述:

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

        题目要求移除满足条件的节点并删除,返回一个新的头节点。那我们逆向走,我们创建一个新的链表,让不满足 Node.val == val 的节点到新的链表去,这样也实现了删除的作用。

        首先我们创建一个pcur指针,指向的是原链表的头节点,然后while循环遍历,pcur不为空,再进行if判断即可。循环结束后newtail不为空的话,让他的下一位滞空,防止出现野指针,最后返回新的链表头节点即可。

代码展示:

struct ListNode {*     int val; //int data;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {//创建一个空链表ListNode *newhead,*newtail;newhead=newtail=NULL;ListNode *pcur=head;while(pcur){//找值不为val的节点if(pcur->val!=val){if(newtail==NULL){newhead=newtail=pcur;}else{newtail->next=pcur;newtail=newtail->next;}}pcur=pcur->next;}if(newtail){newtail->next=NULL;}return newhead;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

秋叶SD4.9最新版本,解压就能使用,Ai生图超级强大!!!

Midjourney &#xff0c;StableDiffusion&#xff0c;ComfyUI&#xff0c;在AI绘画领域&#xff0c;这3款工具非常有名&#xff0c;Midjourney 这一款对网络有要求&#xff0c;一般可能上不了。SD和ComfyUI是可以本地运行&#xff0c;只要你的电脑配置了8G及以上的独立显卡&…

Docker — 跨平台和环境部署

Docker 是一个开源的容器化平台&#xff0c;通过将应用程序和其依赖打包在一个轻量级、独立的容器中&#xff0c;能够跨平台和环境部署。 1. Docker 基本概念 镜像 (Image)&#xff1a;Docker 镜像是一个只读模板&#xff0c;包含运行应用程序所需的代码、库、依赖和环境配置。…

qt QFocusEvent详解

1、概述 QFocusEvent是Qt C框架中的一个事件类&#xff0c;它专门用于处理与焦点变化相关的事件。在图形用户界面&#xff08;GUI&#xff09;编程中&#xff0c;焦点事件是不可或缺的一部分&#xff0c;它们允许开发者在控件获取或失去焦点时执行特定的操作。QFocusEvent通常…

高性能分布式缓存Redis-高级应用篇章

一、发布订阅 Redis提供了发布订阅功能&#xff0c;可以用于消息的传输 Redis的发布订阅机制包括三个部分&#xff0c;publisher&#xff0c;subscriber和Channel 发布者和订阅者都是Redis客户端&#xff0c;Channel则为Redis服务器端。 发布者将消息发送到某个的频道&…

使用Python Flask实战构建Web应用

Python Flask是一个轻量级的Web框架&#xff0c;它简单易用、灵活性高&#xff0c;适用于构建各种规模的Web应用。本文将介绍如何使用Python Flask框架来实战构建一个简单的Web应用&#xff0c;并展示其基本功能和特性。 第一部分&#xff1a;搭建开发环境 在开始之前我们需要…

dockerfile 和 docker compose

目录 1.dockerfile和docker compose区别 主要区别 目的&#xff1a; 格式&#xff1a; 使用场景&#xff1a; 2.Dockerfile 2.1基本格式 2.2模块解析 2.3例子 3.docker compose 3.1安装 3.2格式 3.3执行 1.dockerfile和docker compose区别 Dockerfile 和…

如何安全的使用助听器?

安全使用助听器是非常重要的&#xff0c;以下是一些关键的建议和注意事项&#xff0c;以确保您或您的家人能够正确且安全地使用助听器&#xff1a; 1. 遵循专业指导 •在初次佩戴前&#xff0c;请务必咨询专业的听力师或医生。他们会根据您的听力状况和个人需求来调整助听器的…

VMWare安装以后虚拟机NAT模式时网卡down问题

安装完成VMware后&#xff0c;安装linux虚拟机&#xff0c;网络模式为NAT模式&#xff0c;用来联网&#xff0c;但是发现虚拟机的网卡状态一直是down的。 service network restart 会报错 解决办法如下&#xff1a; ctlaltdelete打开任务管理->服务->打开服务->找到…

Springcloud高校选课管理系统-计算机毕业设计源码27115

摘 要 随着信息技术的快速发展和高校信息化建设的深入推进&#xff0c;选课管理系统作为高校教育信息化建设的重要组成部分&#xff0c;其重要性和紧迫性日益凸显。传统的选课管理系统往往采用单体架构&#xff0c;存在系统耦合度高、可维护性差、扩展性不强等问题&#xff0c;…

Java项目实战II基于Spring Boot高校教师科研管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着高等教育的快速发展和科研活动的日…

Markdown快速上手(typora)

一级标题~六级标题 可以选中文本在这里直接设置&#xff0c;后面也有快捷键&#xff0c;也可以使用其语法&#xff0c;一个#&#xff0c;对应一级标题&#xff0c;两个#&#xff0c;对应二级标题&#xff0c;等。 我这里使用Ctrl1没生效是因为快捷键冲突&#xff0c;也需要注意…

更快更强 | HP15加热台新品!Max温度350度,200度只需60秒!30~150W功率可调,恒温加热和回流焊双模式!

正点原子HP15加热台更快更强&#xff01;最高温度可达350度&#xff0c;200度只需60秒&#xff01;30~150W功率可调&#xff0c;恒温加热和回流焊双模式&#xff01; HP15是正点原子全新推出的迷你恒温加热台&#xff0c;设备支持30~150W功率可调&#xff0c;在150W功率下从室温…

【点云网络】 pointnet 和 pointnet++

这两个网络都是斯坦福大学的一个团队提出的 我先先看一下pointnet的网络架构,这个网络比较经典&#xff0c;是2016年提出的&#xff1a; PointNet 是一个专门用于点云数据处理的神经网络。它的设计目的是直接操作不规则的点云数据&#xff0c;而无需将点云数据转换为规则网格或…

分布式——BASE理论

简单来说&#xff1a; BASE&#xff08;Basically Available、Soft state、Eventual consistency&#xff09;是基于CAP理论逐步演化而来的&#xff0c;核心思想是即便不能达到强一致性&#xff08;Strong consistency&#xff09;&#xff0c;也可以根据应用特点采用适当的方…

FPGA实战篇:Moore/Mealy状态机

什么是状态机&#xff1f; 状态机是根据当前输入信号和自身当前所处状态来改变输出逻辑的一种逻辑系统&#xff0c;目前它也被抽象应用于软件设计当中&#xff0c;本文从硬件设计角度来解释状态机&#xff0c;使用Verilog语言来抽象描述并实现状态机。 状态机类型 状态分为两…

influxdb与LSM-TREE

一、什么是LSM-TREE 在一些写多读少的场景&#xff0c;为了加快写磁盘的速度&#xff0c;提出使用日志文件追加顺序写&#xff0c;加快写的速度&#xff0c;减少随机读写。但是日志文件只能遍历查询。不支持随机查询&#xff0c;提出使用LSM-TREE。除了利用磁盘顺序写之外&…

Mac保护电池健康,延长电池使用寿命的好方法

使用Mac的过程中&#xff0c;如何延长电池的使用寿命是大家非常关心的问题&#xff0c;而养成一个良好的充电习惯能够有效的延长电池的使用寿命 避免过度充电和过度放电能够有效的保护电池&#xff0c;因此长时间的充电与长时间放点都不可取&#xff0c;但是在日常的使用过程中…

AutosarMCAL开发——基于EB ResourceM模块

目录 一、ResourceM模块的作用以及原理1.ResourceM模块的作用2.单核系统运行原理a.上电复位b.启动代码执行c.应用程序加载d.应用程序执行 3.代码执行过程4.内存分配a.地址空间划分b.具体地址分配c.示例说明 4.多核系统运行原理a.MCU架构 二、EB配置介绍三、总结 一、ResourceM模…

【LeetCode】返回链表的中间结点、删除链表的倒数第 N 个结点

主页&#xff1a;HABUO&#x1f341;主页&#xff1a;HABUO &#x1f31c;钱塘江上潮信来&#xff0c;今日方知我是我&#x1f31b; 1.返回链表的中间结点 题目&#xff1a;给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0…

Netty篇(学习前言)

目录 一、为什么使用Netty 1. Netty编程相比NIO编程的优势 2. Netty 相比其它网络应用框架的优势 二、让我们走进Netty 1. 简介 2. 设计目标 3. 主要特点 4. Netty的作者 5. Netty 的地位 6. Netty 的优势 五、Netty版本说明 六、Netty架构设计 1. 线程模型基本介绍…