Collection与数据结构 链表与LinkedList(三):链表精选OJ例题(下)
1. 分割链表
OJ链接
class Solution {public ListNode partition(ListNode head, int x) {if(head == null){return null;//空链表的情况}ListNode cur = head;ListNode formerhead = null;ListNode formerend = null;ListNode latterhead = null;ListNode latterend = null;//定义链表分区while (cur != null){//遍历链表if(cur.val < x){if(formerhead == null){formerhead = cur;formerend = cur;//第一次遍历头和尾都为null//formerend = formerend.next;错误,不可以使得formerend向下走,否者为null,会空指针异常}else{formerend.next = cur;formerend = formerend.next;//formerend全程不可以为空}}if(cur.val >= x){if(latterhead == null){latterhead = cur;latterend = cur;}else{latterend.next = cur;latterend = latterend.next;}}cur = cur.next;}if(formerhead == null){//链表前段位空时的情况,formerend为空,下面会报异常return latterhead;}if(latterhead != null){//当链表后段不为空时,(为空不走这一步,否则空指针异常),链表的最后需要手动置为nulllatterend.next = null;}formerend.next = latterhead;//之所以上面要求formerend全程不为空,是因为这一步会报异常,nullreturn formerhead;}
}
整体思路:
创建一个新的链表,把这个新的链表用x分段,遍历原链表,根据条件把结点放入新链表,之后把前面一段链表和后面一段链表连接起来.
[注意事项]
- 要始终保持fe(formerend)不为空,否者在最后连接的时候就要报空指针异常
- 考虑几种特殊情况
- 链表为空,返回null
- 前半段链表为空,在最后连接的时候会报空指针异常,所以在最后的时候返回lb即可.
- 当后半段链表不为空的时候,最后一个结点的next有可能不为null,所以要对最后手动置空,否者会越界.
动态演示
分割链表
2. 回文链表
OJ链接
class Solution {public boolean isPalindrome(ListNode head) {if(head == null){//空链表情况下return true;}ListNode fast = head;ListNode slow = head;ListNode cur = null;while(fast != null && fast.next != null){fast = fast.next.next;slow = slow.next;//找到中间结点}cur = slow.next;while(cur != null){ListNode curNext = cur.next;//在循环体中定义ListNode,防止空指针异常cur.next = slow;slow = cur;cur = curNext;}//翻转后半段链表cur = head;while(cur != slow){//奇数判断回文if(cur.val != slow.val){return false;}if(cur.next == slow){//偶数判断回文return true;}cur = cur.next;slow = slow.next;}return true;}
}
整体思路:
先使用快慢指针找到中间节点,之后将后半段链表使用头插法翻转.之后把head和slow向中间遍历,相遇就是回文.
[注意事项]
- 注意区分奇偶数,奇数整体思路没问题,但是偶数永远不会相遇,此时就需要引入
if(cur.next == slow)
判断偶数情况.
动态演示
回文链表(偶数)
回文链表(奇数)
3. 相交链表
OJ链接
public class Solution {public ListNode getIntersectionNode(ListNode headA, ListNode headB) {int lenA = 0;int lenB = 0;ListNode cur = headA;while(cur != null){lenA++;cur = cur.next;}cur = headB;while(cur != null){lenB++;cur = cur.next;}//计算两个链表的长度int len = lenA-lenB;//计算长度之差,但是有可能为负数ListNode longList = headA;ListNode shortList = headB;//定义长链表和短链表,如果len为正,则longList为A,另一个为Bif(len < 0){//负数则相反longList = headB;shortList = headA;len = lenB-lenA;//把len变为正数}while(len != 0){longList = longList.next;len--;//先让长链表走差值步}while(longList != shortList){longList = longList.next;shortList = shortList.next;//之后一起走,直到相交}if(longList == null || shortList == null){return null;//没有交点的情况}return longList;//返回交点}
}
整体思路
先让长链表走短链表与长链表的差值步,之后一起走,相遇之后就有交点.
[注意事项]
- 不确定哪个链表长,哪个链表短,所以长度的差值可能为负数.我们定义长链表和短链表来解决这个问题,利用长度的差值来判断长短.
- 有一个非常隐形的问题,链表可能不想交,所以我们要用
if(longList == null || shortList == null)
来限制.虽然没有这句话也可以跑过,是因为最后longList和shortList都走到了null,返回longList正好也是null.所以这个问题非常隐性.
动态演示
相交链表
4. 环形链表
OJ链接
ublic class Solution {public boolean hasCycle(ListNode head) {ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null){//先以无环作为跳出循环的条件,因为是快指针,所以两个条件缺一不可fast = fast.next.next;slow = slow.next;if(slow == fast){//在走的过程中再判断什么时候相等,返回即可return true;}}return false;}
}
整体思路
定义一个快指针,一个慢指针,快指针一次走两步,慢指针一次走一步,最终进入环的时候必定会相遇.相遇一定就有环.
[注意事项]
- 首先判断的是链表有没有环,这是循环的条件.
- 在循环体内部再判断会不会相遇.
动态演示
环形链表
5. 寻找环形链表的环入口
OJ链接
public class Solution {public ListNode detectCycle(ListNode head) {ListNode fast = head;ListNode slow = head;while(fast != null && fast.next != null){//无环情况fast = fast.next.next;slow = slow.next;if(fast == slow){//相遇的情况while(head != slow){head = head.next;slow = slow.next;//向环的入口靠近}return slow;//相遇的位置即为入口}}return null;}
}
整体思路
先找到相遇的点,之后根据数学推导可知,链表头到入口的距离与相遇点到入口的距离相等,让head和slow同时向入口处走,相遇的地方就是要返回的点.
[数学推导]
动态演示
寻找环的入口
相关文章:

Collection与数据结构 链表与LinkedList(三):链表精选OJ例题(下)
1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…...
如何通过C++身份证实名认证接口实现实名认证功能
线上平台使用身份核验过程是验证个人身份真实性的过程,对于大多数线上平台来说,自己去开发集成身份证实名认证接口需要耗费大量的人力、物力成本,对此,为助力有需要的企业快速实现实名认证的功能,翔云平台提供了身份证…...

用html写一个爱心
<!DOCTYPE html> <html lang"zh-CN"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><title>爱您</title><style>* {padding: 0;margin: 0;}body {background-color: pin…...
如何看到 synchronized 背后的“monitor 锁”?
Java全能学习+面试指南:https://javaxiaobear.cn 获取和释放 monitor 锁的时机 我们都知道,最简单的同步方式就是利用 synchronized 关键字来修饰代码块或者修饰一个方法,那么这部分被保护的代码,在同一时刻就最多只有一个线程可以运行,而 synchronized 的背后正是利用 …...
如何建立一个网页模版
创建一个网页模板涉及的主要步骤如下: 基本HTML结构模板创建: 创建HTML文件: 首先,你需要创建一个新的HTML文件,并在其中编写基本的HTML结构,例如: <!DOCTYPE html> <html lang="zh"> <head><meta charset="UTF-8"...
P8783 [蓝桥杯 2022 省 B] 统计子矩阵
题目:P8783 [蓝桥杯 2022 省 B] 统计子矩阵 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 代码:(部分解析在代码中) #include<bits/stdc.h> using namespace std; long long a[1010][1010]; long long pre[1010][1010]; long long …...

【C++】list介绍
个人主页 : zxctscl 如有转载请先通知 文章目录 1. list介绍2. list的构造3. ist iterator的使用4. capacity5. element access6. modifiers7. 迭代器失效8. Operations8.1 reverse8.2 sort8.3 unique8.4 splice 1. list介绍 list是可以在常数范围内在任意位置进行插…...

【SQL Server】2. 将数据导入导出到Excel表格当中
最开始,博主介绍一下自己的环境:SQL Sever 2008 R2 SQL Sever 大致都差不多 1. 通过自带软件的方式 首先找到下载SQL Sever中提供的导入导出工具 如果开始界面没有找到自己下载的路径 C:\Program Files\Microsoft SQL Server\100\DTS\Binn下的DTSWiz…...

基于JAVA+SSM+VUE的前后端分离的大学竞赛管理系统
一、项目背景介绍: 随着互联网技术的快速发展,大学竞赛管理系统已经成为了各个高校组织和管理各类学术竞赛的重要工具。传统的大学竞赛管理系统往往采用前后端混合的开发模式,导致系统的性能和可维护性受到限制。为了提高系统的开发效率和用户…...

音频转换工具 Bigasoft FLAC Converter for Mac
Bigasoft FLAC Converter for Mac是一款专为Mac用户设计的音频转换工具,它能够将FLAC音频文件高效、高质量地转换为其他常见的音频格式,如MP3、AAC等。这款软件具有直观易用的界面,使用户能够轻松上手,无需复杂的操作步骤即可完成…...
洛谷 P4554 小明的游戏
思路:双端队列。 其实一开始你可以用BFS进行实验,由于我们需要找最小的费用,所以我们在BFS的时候可以这样想:在我们遍历到第一块板子的时候,在找周围的路时,我们可以改成这样的判断:如果周围的…...

序列化案例实操(统计每一个手机号耗费的总上行流量、总下行流量、总流量)
文章目录 序列化概述自定义bean对象实现序列化接口(Writable)案例需求编写MapReduce程序运行结果 序列化概述 序列化就是把内存中的对象,转换成字节序列(或其他数据传输协议)以便于存储到磁盘(持久化&…...

使用 LLMLingua-2 压缩 GPT-4 和 Claude 提示
原文地址:Compress GPT-4 and Claude prompts with LLMLingua-2 2024 年 4 月 1 日 向大型语言模型(LLM)发送的提示长度越短,推理速度就会越快,成本也会越低。因此,提示压缩已经成为LLM研究的热门领域。 …...

编程大牛坚持了 10 年的 10 个编程好习惯
目录 1.多看官方文档 2.面向搜索引擎编程 3.规范命名 4.认真注释 5.不要重复造轮子 6.多读多写代码 7.预留开发时间 8.大胆重构 9.师傅领进门 10.多阅读源码 1.多看官方文档 不要被这几个字吓到,官方文档其实都是宝藏。 一个成熟的技术诞生,…...

QEMU上PAC功能验证与异常解析
PAC功能如何验证?PAC检查失败时发生什么?问题如何定位?本博客主要探讨这些问题。...

简约轻量-失信录系统源码
失信录系统-最新骗子收录查询系统源码 首页查询: 举报收录页: 后台管理页: 失信录系统 V1.0.0 更新内容: 1.用户查询,举报功能 2.界面独立开发 3.拥有后台管理功能 4.xss,sql安全过滤 5.平台用户查询 6.用户中心(待完…...

前端入门系列-HTML-HTML常见标签(注释,标题,段落,换行)
🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” HTML常见标签 注释标签 注释不会显示在界面上,目的是提高代码的可读性 <!---这是一个注释----> 注释的原则 要和代码逻辑一致尽量使用中文不要传递负能量 …...

【mysql 第3-10条记录怎么查】
mysql 第3-10条记录怎么查 在MySQL中,如果你想要查询第3到第10条记录,你通常会使用LIMIT和OFFSET子句。但是,需要注意的是,LIMIT和OFFSET是基于结果集的行数来工作的,而不是基于记录的物理位置。这意味着它们通常与某种…...

1.Git是用来干嘛的
本文章学习于【GeekHour】一小时Git教程,来自bilibili Git就是一个文件管理系统,这样说吧,当多个人同时在操作一个文件的同时,很容易造成紊乱,git就是保证文件不紊乱产生的 包括集中式管理系统和分布式管理系统 听懂…...

Git安装教程(图文安装)
Git Bash是git(版本管理器)中提供的一个命令行工具,外观类似于Windows系统内置的cmd命令行工具。 可以将Git Bash看作是一个终端模拟器,它提供了类似于Linux和Unix系统下Bash Shell环境的功能。通过Git Bash,用户可以在Windows系统中运行基于…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...