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

【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #

文章目录

  • 前言
  • 移除链表元素
  • 相交链表
  • 写在最后

前言

  • 本章的OJ练习也是相对简单的,只要能够理解解题的思路,并且依照这个思路能够快速的写出代码,我相信,你的链表水平已经足够了。

  • 对于OJ练习(2) : ->传送门<-。其中两道题都可运用快慢指针的解题思路,这使得两个题都只需要遍历一次链表即可解答。

  • 对于本章,是链表的OJ练习的最后一篇较为简单的章节,后续的OJ练习将会上难度。


移除链表元素

  • 题目链接:-> 传送门 <-

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

在这里插入图片描述

  • 这里我们采用的方法是在原链表的基础上重新连接节点,将 Node.val == val 的节点跳过不连接。

  • 我们重新定义一个指向新连接的链表的头节点的指针newhead,然后在定义一个用来连接的指针cur,最终连接好后返回newhead即可。

  • Node.val != val 的节点作为新连接的链表的结点 ,如果一开始head为空或者head链表里全是等于val的结点,(初始化newnode = cur = NULL)此时连接操作就不进行,后面返回newnode(一直为NULL)即可。

在这里插入图片描述

在这里插入图片描述

下面是代码实现:

struct ListNode* removeElements(struct ListNode* head, int val){// cur为对新连接的链表的连接指针,newhead为新连接的链表的指向头节点的指针struct ListNode* cur = NULL, * newhead = NULL;struct ListNode* tmp = head;while (tmp){if (tmp->val != val)   // 如果不等于val就连接{if (newhead == NULL)   // 连接时如果新的头为空,就将该节点作为头节点{newhead = cur = tmp;}else      // 正常连接{cur->next = tmp;cur = cur->next;}}tmp = tmp->next;   // 到下一个节点判断}// 如果head为空或者head链表里面所有节点的val都为所给的val,就说明没有新的头,这里判断是为了防止空指针解引用// 如果是正常情况,需要将新连接的最后一个节点的next指向NULL,如果已经指向NULL,多操作一步也没有问题if (cur) cur->next = NULL;// 最后返回新连接的链表的头return newhead;
}

相交链表

  • 题目链接:-> 传送门 <-

  • 该题目描述为:给你两个单链表的头节点 headAheadB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

也就是:

在这里插入图片描述

在这里插入图片描述

解题思路:【双指针遍历

  • 首先我们可以先判断这两个链表是否有一个为空或者都为空,有空的情况那么一定不相交,此时直接返回NULL

  • 如果两个链表相交,那么从相交的那个起始节点开始,后面的长度是相同的。由此我们定义两个指针papb分别指向headA的头节点与headB的头节点并同时向后遍历链表。

  • 如果pa不为NULL,则移到下一个节点,如果pb不为空,也移到下一个节点。如果第一次遍历pa为空,则将pa指向headB的头节点;如果第一次遍历pb为空,则将pb指向headA的头节点。至于到底相不相交,第二遍遍历会见分晓。

  • 我们假设两个链表相交,那么设从相交的初始节点开始到NULL的长度为nheadA的头节点到相交的初始节点的长度为xheadB的头节点到相交的初始节点的长度为y。按照上一条的思路,当pa第一次遍历到达NULL时,pa一共走了x + n的长度,此时将pa指向headB的头节点;当pb第一次遍历到达NULL时,pb一共走了y + n的长度,此时将pb指向headA的头节点。仔细思考就会发现,paheadB走到相交的初始节点还需走y的长度,此时pa一共走了x + n + ypbheadA走到相交的初始节点还需走x的长度,此时pb一共走了y + n + x。这时,pa走的长度与pb走的长度恰好相等,且papb都刚好指向相交的初始节点。所以,该方法能够有效的找出那个相交的初始节点。

在这里插入图片描述

  • 如果两个链表不相交,也是一样,通过双指针分别依次向后遍历链表。如果两个链表长度相等,最终papb在第一次遍历的时候就都会到达NULL,此时返回NULL;如果两个链表长度不相等,同样的,在第一次遍历时,只要pa或者pb指向NULL,就将pa或者pb指向另外一个链表的头节点,然后继续遍历。我们假设headA链表的长度为xheadB链表的长度为y,当pa第一次遍历指向NULL时,走的长度为x,此时将pa指向headB的头节点;当pb第一次遍历指向NULL时,走的长度为y,此时将pb指向headA的头节点。不出所料,两个指针在第二次遍历链表时最后同时指向NULL,这是因为,paheadB的遍历要走的长度为y,此时pa总共走的长度为x + ypbheadA的遍历要走的长度为x,此时pb总共走的长度为y + x。可以看到,第二次遍历走完两个指针走的长度是相同的,并且两个指针都是指向NULL。所以,两个链表不相交,遍历的两个指针最终都是同时指向NULL

在这里插入图片描述

下面是代码实现:

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {// 如果其中有一个链表为空或者全为空,说明不可能相交,直接返回NULLif(headA == NULL || headB == NULL) return NULL;struct ListNode* pa = headA, * pb = headB;// 对于headA与headB只有相交与不相交的情况// 相交则跳出循环// 不相交则再循环里面就返回// pa == pb说明找到相交的初始节点了,条件判断为假,跳出循环while (pa != pb){// 同步向后遍历pa = pa->next;pb = pb->next;// 如果两个指针都指向空,说明headA与headB不相交if (pa == NULL && pb == NULL) return NULL;// 如果pa遍历完headA就到headB继续遍历if (pa == NULL) pa = headB;// 如果pb遍历完headB就到headA继续遍历if (pb == NULL) pb = headA;}   // 这里返回pa或者pb都是可以的,都指向相交的那个初始节点return pa;
}

写在最后

对于单链表的题目练习,最重要的是思路,我们在数据结构阶段要养成画图的习惯,因为它能帮助我们更好的理解。后续还会有单链表相关的题目练习。

感谢阅读本小白的博客,错误的地方请严厉指出噢!

相关文章:

【基础算法】单链表的OJ练习(3) # 移除链表元素 # 相交链表 #

文章目录前言移除链表元素相交链表写在最后前言 本章的OJ练习也是相对简单的&#xff0c;只要能够理解解题的思路&#xff0c;并且依照这个思路能够快速的写出代码&#xff0c;我相信&#xff0c;你的链表水平已经足够了。 对于OJ练习&#xff08;2&#xff09; : ->传送门…...

【自用】SpringBoot项目通用类整理

文章目录全局Json序列化Controller日志切面全局异常拦截GlobalExceptionHandlerApiResultBusinessExceptionResponseEntityUtil全局返回体包装MP自动填充接口文档配置类自定义Async异步线程池本文主要整理各类项目中通用的配置类、工具类&#xff0c;便于复查自用。 全局Json序…...

动态规划法(总述)多阶段决策最优化问题

动态规划: 研究最优控制问题提出的 该问题有n个输入&#xff0c;问题的解由这n个输入组成&#xff0c;这个子集必须满足事先给定的条件&#xff0c;这些条件称为约束条件&#xff0c;满足约束条件的可行解可能不只有一个为了衡量可行解的优劣&#xff0c;通常以一些函数的形式&…...

MySQL跨服务器数据映射

MySQL跨服务器数据映射环境准备1. 首先是要查看数据库的federated引擎 开启/关闭 状态2. 打开任务管理器&#xff0c;并重启mysql服务3. 再次查看FEDERATED引擎状态&#xff0c;引擎已启动映射实现问题总结在日常的开发中经常进行跨数据库进行查询数据。 同服务器下跨数据库进…...

利用反射实现通过读取配置文件对类进行实例化-课后程序(JAVA基础案例教程-黑马程序员编著-第十二章-课后作业)

【案例12-3】&#xff1a;利用反射实现通过读取配置文件对类进行实例化 【案例介绍】 1.案例描述 现在有一个项目&#xff0c;项目中创建了一个Person类&#xff0c;在Person类中定义了一个sleep()方法。在工程中还定义了一个Student类继承Person类&#xff0c;在Student类中…...

1.2 CSS文本属性

CSS Text(文本)属性&#xff1a; 定义文本外观&#xff0c;颜色&#xff0c;装饰&#xff0c;缩进&#xff0c;行间距来修饰文本 文本样式 文本缩进 text-indent文本水平对齐方式&#xff1a;text-align文本修饰&#xff1a;text-decoration行高 line-height CSS文本颜色属性…...

SpringCloud之认识微服务

文章目录一、传统项目转型二、走进 SpringCloud三、微服务项目搭建3.1 创建一个 SpringBoot 项目3.2 创建三个 Maven 子工程3.3 为子工程创建 application.yml3.4 引入依赖3.5 数据库 建库建表3.6 编写业务提示&#xff1a;以下是本篇文章正文内容&#xff0c;SpringCloud系列学…...

【go语言之thrift协议二之server端分析】

go语言之thrift协议二serverthrift.TProtocolFactoryTTransportReadWriteCloserContextFlusherReadSizeProviderTProtocolrunServerNewTServerSocketNewCalculatorHandlerNewCalculatorProcessorNewTSimpleServer4server.ServeListenAcceptLoopprocessRequests在上一篇文章分析…...

【办公类05-03】Python批量修改文件名前面的序号(已有的序号错了,需要改成正确的号码)

背景需求下载教程&#xff0c;手动输入编号&#xff0c;有一个编号错误&#xff0c;导致后面所有编号都错了。30实际是29&#xff0c;以此类推怎样才能快速修改编号数字&#xff1f;前期考虑到可能要改编号&#xff0c;所以在每个编号后面加“ ”&#xff08;空格&#xff09;&…...

定向模糊测试工具Beacon基本用法

Beacon是一个定向模糊测试工具&#xff0c;给定行号&#xff0c;能够定向探索行号附近的代码区域。主要思想是采用静态分析的方法获取到与目标有关的变量的最弱前置条件&#xff08;weakest precondition&#xff09;的信息&#xff0c;并在相关位置插入断言&#xff0c;来提前…...

《程序员面试金典(第6版)》面试题 02.01. 移除重复节点

题目描述 编写代码&#xff0c;移除未排序链表中的重复节点。保留最开始出现的节点。 示例1: 输入&#xff1a;[1, 2, 3, 3, 2, 1] 输出&#xff1a;[1, 2, 3] -示例2: 输入&#xff1a;[1, 1, 1, 1, 2] 输出&#xff1a;[1, 2] 提示&#xff1a; 链表长度在[0, 20000]范…...

如何对web系统开展无障碍测试

Accessibility test&#xff08;无障碍测试&#xff09;是一种测试方法&#xff0c;旨在评估软件、网站或其他数字产品的可访问性&#xff0c;以确保它们能够被身体残障或其他特殊需求的用户使用。这些测试通常包括使用辅助技术&#xff0c;如屏幕阅读器和放大器&#xff0c;以…...

使用vite+vue3.0 创建一个cesium基础应用 ----01 项目搭建

使用vitevue3.0 创建一个cesium基础应用 ----01 项目搭建 1.使用yarn创建一个vite项目 我们可以在vite官网找到vite创建项目的命令 https://cn.vitejs.dev/ 可以使用yarn创建项目选择使用vue3.0框架&#xff0c;语言使用js 创建完成后结构如下&#xff1a; 2.找到vite社区中的…...

【Python学习笔记】第二十七节 Python 多线程

一、进程和线程进程&#xff1a;是程序的一次执行&#xff0c;每个进程都有自己的地址空间、内存、数据栈及其他记录运行轨迹的辅助数据。线程&#xff1a;所有的线程都运行在同一个进程当中&#xff0c;共享相同的运行环境。线程有开始、顺序执行和结束三个部分&#xff0c; …...

【id:18】【20分】B. DS顺序表--连续操作

题目描述建立顺序表的类&#xff0c;属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为1000&#xff09;该类具有以下成员函数&#xff1a;构造函数&#xff1a;实现顺序表的初始化。插入多个数据的multiinsert(int i, int n, int item[])函数&#xff0c;实现在…...

vi编辑器操作指令分享

vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;它的强大不逊色于任何最新的文本编辑器&#xff0c;这里只是简单地介绍一下它的用法和一小部分指令。由于对Unix及Linux系统的任何版本&#xff0c;vi编辑器是完全相同的&#xff0c;因此您可以在其他任何介绍vi的地方…...

OSPF与BFD联动配置

13.1.1BFD概念 BFD提供了一个通用的、标准化的、介质无关的、协议无关的快速故障检测机制,有以下两大优点: 对相邻转发引擎之间的通道提供轻负荷、快速故障检测。 用单一的机制对任何介质、任何协议层进行实时检测。 BFD是一个简单的“Hello”协议。两个系统之间建立BFD会…...

jQuery基础

> &#x1f972; &#x1f978; &#x1f90c; &#x1fac0; &#x1fac1; &#x1f977; &#x1f43b;‍❄️&#x1f9a4; &#x1fab6; &#x1f9ad; &#x1fab2; &#x1fab3; &#x1fab0; &#x1fab1; &#x1fab4; &#x1fad0; &#x1fad2; &#x1…...

day39|139.单词拆分 背包问题ending

139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例 1&#xff1a; 输入: s "leetcode",…...

Shell脚本编程

Shell编程 视频地址https://www.bilibili.com/video/BV1hW41167NW/?p1&vd_source977d52a6b92ce8b6ae67c16fc61f0428 第一章 Shell概述 大数据程序员为什么要学习Shell呢&#xff1f; 需要看懂运维人员编写的Shell程序偶尔会编写一些简单的Shell程序来管理集群&#xf…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...