算法通关村第一关|黄金挑战|链表中的环问题双向链表

1.链表中环的问题

1.1 判断是否有环:使用集合处理,判断是否碰撞。

public ListNode detectCycle(ListNode head) {ListNode pos = head;Set<ListNode> visited = new HashSet<ListNode>();while (pos != null) {if (visited.contains(pos)) {return pos;} else {visited.add(pos);}pos = pos.next;}return null;
}

1.2 判断是否有环:使用快慢指针,如果有环,慢的就一定能遇到快的。

public boolean hasCycle(ListNode head) {if (head == null || head.next == null) {return false;}ListNode fast = head;ListNode slow = head;while (fast != null && fast.next != null) {fast = fast.next.next;slow = slow.next;if (fast == slow) {return true;}}return false;
}

1.3 有环时判断环的位置:使用快慢指针。

public ListNode detectCycle(ListNode head) {if (head == null) {return null;}ListNode slow = head, fast = head;while (fast != null) {slow = slow.next;if (fast.next != null) {fast = fast.next.next;} else {return null;}if (fast == slow) {ListNode ptr = head;while (ptr != slow) {ptr = ptr.next;slow = slow.next;}return ptr;}}return null;
}

2.双向链表

2.1 双向链表的结点。

class DoubleNode {public int data;public DoubleNode next;public DoubleNode prev;public DoubleNode(int data) {this.data = data;}// 打印结点数据域public void displayNode() {System.out.println("{" + data + "}");}
}

2.2 双向链表的结构和遍历方法。

public class DoublyLinkList {// 分别指向双向链表的头部和尾部private DoubleNode first;private DoubleNode last;public DoublyLinkList() {first = null;last = first;}// 从头部开始打印public void displayForward() {System.out.println("List(first--->last):");DoubleNode current = first;while (current != null) {current.displayNode();current = current.next;}System.out.println();}// 从尾部开始演绎public void displayBackward() {System.out.println("List(last--->first):");DoubleNode current = last;while (current != null) {current.displayNode();current = current.prev;}System.out.println();}
}

2.3 双向链表插入元素:在头部和尾部插入元素。

// 头部插入
public void insertFirst(int data) {DoubleNode newDoubleNode = new DoubleNode(data);if (first == null) {last = newDoubleNode;} else {first.prev = newDoubleNode;}newDoubleNode.next = first;first = newDoubleNode;
}
//尾部插入
public void insertLast(int data) {DoubleNode newDoubleNode = new DoubleNode(data);if (first == null) {first = newDoubleNode;} else {newDoubleNode.prev = last;last.next = newDoubleNode;}last = newDoubleNode;
}

2.4 双向链表插入元素:在中间插入元素。

public void insertAfter(int key, int data) {DoubleNode newDoubleNode = new DoubleNode(data);DoubleNode current = first;while ((current != null) && (current.data != key)) {current = current.next;}// 当前结点current为空if (current == null) {if (first == null) {// 链表中没有元素,直接赋值first = newDoubleNode;last = newDoubleNode;} else {// 找不到key,在链表尾部插入新结点last.next = newDoubleNode;newDoubleNode.prev = last;last = newDoubleNode;}} else {// 链表中有元素,并且找到了keyif (current == last) {// key与最后结点的data相等newDoubleNode.next = null;last = newDoubleNode;} else {// 两结点中间插入newDoubleNode.next = current.next;current.next.prev = newDoubleNode;}current.next = newDoubleNode;newDoubleNode.prev = current;}
}

2.5 双向链表删除元素:删除首尾元素。

// 删除首部元素
public DoubleNode deleteFirst() {DoubleNode temp = first;if (first.next = null) {last = null;} else {first.next.prev = null;}first = first.next;return temp;
}// 删除尾部元素
public DoubleNode deleteLast() {DoubleNode temp = last;if (first.next == null) {first = null;} else {last.prev.next = null;}last = last.prev;return temp;
}

2.6 双向链表删除元素:删除中间元素。

public DoubleNode deleteKey(int key) {DoubleNode current = first;while (current != null && current.data != key) {current = current.next;}if (current == null) {return null;} else {if (current == first) {first = current.next;current.next.prev = null;} else if (current == last) {last = current.prev;current.prev.next = null;} else {current.prev.next = current.next;current.next.prev = current.prev;}}return current;
}

如果对您有帮助,请点赞关注支持我,谢谢!❤
如有错误或者不足之处,敬请指正!❤

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

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

相关文章

ElementPlus表格中的背景透明

ElementPlus表格中的背景透明 最近写大屏&#xff0c;用到elementplus中的el-table&#xff0c;为了让显示效果好看一点&#xff0c;需要把表格的白色背景调整为透明&#xff0c;与整个背景融为一体。可以参考的资料非常少&#xff0c;大部分都是ElmentUI的方法&#xff0c;在…

Gradient conjugate priors and multi-layer neural networks

动机 先验参数 m , α , β , v m,\alpha,\beta,v m,α,β,v和随机变量 τ \tau τ KL散度的形式是&#xff1a; Dynamics of m , α , β , v m,\alpha,\beta,v m,α,β,v Dynamics of m , β , v m,\beta,v m,β,v for a fixed α \alpha α 绿色轨迹连接初始点和目标点…

KVM动态在线迁移实操笔录

环境介绍 一台NFS&#xff08;192.168.184.132&#xff09; 一台KVM-a&#xff08;192.168.184.133&#xff09; 一台KVM-b&#xff08;192.168.184.134&#xff09; NFS配置 [rootlocalhost ~]# setenforce 0 //关闭selinux [rootlocalhost ~]# service iptables stop [root…

ZKP5.1 Plonk Interactive Oracle Proofs (KZG‘10)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 5: The Plonk SNARK (Dan Boneh) 5.1 KZG’10 general SNARK A polynomial commitment scheme A polynomial interactive oracle proof (IOP) Review: polynomial commitments The KZG poly-commit scheme commit a bind…

【网络协议】聊聊ICMP与ping是如何测试网络联通性

ICMP协议格式 ping是基于iCMP协议工作的&#xff0c;ICMP全称Internet Control Message Protocol&#xff0c;就是互联网控制报文协议。其实就是有点类似于古代行军打仗&#xff0c;哨探进行前方探明具体情况。 IMCP本身处于网络层&#xff0c;将报文封装在IP包里&#xff0c;…

【Datawhale】扩散模型学习笔记 第一次打卡

文章目录 扩散模型学习笔记1. 扩散模型库Diffusers1.1 安装1.2 使用 2. 从零开始搭建扩散模型2.1 数据准备2.2 损坏过程2.3 模型构建2.4 模型训练2.5 采样 3. webui 扩散模型学习笔记 1. 扩散模型库Diffusers 1.1 安装 由于diffusers库更新较快&#xff0c;所以建议时常upgr…

矩阵系统功能/如何操作

矩阵系统是一种广泛应用于企业管理、组织结构设计和战略制定领域的系统。它是由多个因素相互作用而形成的网络&#xff0c;旨在实现特定的组织目标。矩阵系统的主要特点是将不同功能和区域的部分组合在一起&#xff0c;形成一个完整的系统&#xff0c;从而更好地满足组织的需求…

04、MySQL-------MyCat实现分库分表

目录 九、MyCat实现分库分表1、分库分表介绍&#xff1a;横向&#xff08;水平&#xff09;拆分**垂直分表**&#xff1a;水平分表&#xff1a;**分库分表** 纵向&#xff08;垂直&#xff09;拆分分表字段选择 2、分库分表操作&#xff1a;1、分析图&#xff1a;2、克隆主从3、…

QT中窗口自绘制效果展示

项目中需要使用QT进行窗口自绘&#xff0c;前期先做一下技术探索&#xff0c;参考相关资料代码熟悉流程。本着代码是最好的老师原则&#xff0c;在此记录一下。 目录 1.运行效果 2.代码结构 3.具体代码 1.运行效果 2.代码结构 3.具体代码 myspeed.pro QT core gui…

notes_NLP

RNN > LSTM, GRU model特点RNNLSTMinputforgetputput&#xff1b;GRUresetupdate&#xff1b;参数比LSTM少&#xff0c;计算效率更高&#xff1b; 循环神经网络&#xff08;RNN/LSTM/GRU&#xff09; 人人都能看懂的GRU transformer > self-attention 根据Query和Key计…

陪诊小程序|陪诊小程序关爱健康,无忧陪伴

随着社会发展和人们生活水平的提高&#xff0c;健康问题成为人们关注的焦点。然而&#xff0c;在就医过程中&#xff0c;许多患者常常感到孤独和无助&#xff0c;缺乏得到家人陪伴的温暖与安慰。为了解决这一问题&#xff0c;我们公司开发了一款创新的陪诊小程序软件&#xff0…

Pandas数据处理分析系列2-数据如何导入

Pandas Excel 数据导入 Pandas库提供了一组强大的输入/输出(I/O)函数(简称为:I/O API),用于读取和写入各种数据格式,目前已支持常见的多种外数据格式。 Pandas 常见读取方法如下表: 可以看出,在使用Pandas 读取数据格式文件时,只需一个方法则可,不同的方法参数, 可…

【C++学习笔记】内联函数

1. 概念 以inline修饰的函数叫做内联函数&#xff0c;编译时C编译器会在调用内联函数的地方展开&#xff0c;没有函数调 用建立栈帧的开销&#xff0c;内联函数提升程序运行的效率。 如果在上述函数前增加inline关键字将其改成内联函数&#xff0c;在编译期间编译器会用函数…

Mysql 以字符分割一行变多行(substring_index函数)

问题 有时候我们表里会存在某个字符(例如经常用到的,)分割的分割的数据&#xff0c;但是在使用的时候要将存在字符分割数据拆分&#xff0c;我们一般的做法先从数据库中将数据查询出&#xff0c;在内存中通过字符串分割函数split进行处理&#xff0c;不会在sql中通过函数进行拆…

SpringCloud学习笔记(上):服务注册与发现:Eureka、Zookeeper、Consul+负载均衡服务调用:Ribbon

壹、零基础 一、微服务架构零基础理论入门 SpringCloud分布式微服务架构的一站式解决方案&#xff0c;是多种微服务架构落地技术的集合体&#xff0c;俗称微服务全家桶。 二、从2.2.x和H版开始说起 springboot版本选择&#xff1a; git源码地址&#xff1a;https://github.…

【超详细】CentOS 7安装MySQL 5.7【安装及密码配置、字符集配置、远程连接配置】

准备工作&#xff1a;CentOS 7系统&#xff0c;并确保可以联通网络 1、获取MySQL 5.7 Community Repository软件包 注意&#xff1a;这里使用的是root用户身份。 wget https://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm2、安装软件包 rpm -ivh mysql5…

SoftPlc on docker 测试

Swagger 返回的数据 为 Base64编码&#xff0c;要查看 用下面的在线工具转换HEX Base64 to Hex | Base64 Decode | Base64 Converter | Base64 软件主页https://github.com/fbarresi/SoftPlc 安装 docker stop softplc docker rm softplc docker pull fbarresi/softplc:lat…

全网最丑焊锡教程(仅排针焊接心得)

一直以来玩各种开发板&#xff0c;焊接水平太差始终是阻碍我买性价比高的板子的最大原因。淘宝上好多芯片搭载上肥猪流板子是不包排针焊接的。终于下定决心要克服这个困难。不过&#xff0c;只是会焊接排针在高手面前最好不要说自己会焊锡&#xff0c;这应该是两码事。 首先上…

高级软件工程师职业发展路径及适学人群

大数据赋能产业&#xff0c;改变人与场景的交互方式&#xff0c;随着大数据在各行各业融合应用的不断深化&#xff0c;预计2020年中国大数据市场市值将突破10000亿元。 未来发展&#xff0c;大数据应用范围越加宽广&#xff0c;包括&#xff1a;新零售、旅游、广告、电商…

【javascript】内部引入与外部引入javascript

创建a.html 内部引入&#xff1a; 外部引入&#xff1a; 创建a.js 注意&#xff1a; 我这里的a.js和a.html是放在同一个目录下&#xff0c;如果a.js放在js的目录下&#xff0c;a.html 调用a.js的时候 <script src"/js/a.js"></script>