用单链表实现集合

一、实验题目

(1)实验题目
用单链表实现集合
(2)问题描述
用有序单链表实现集合的判等、交、并和差等基本运算。

二、实验内容

(1)采用有序单链表存储集合;
(2)实现交、并、差等基本运算时,要求算法的空间复杂度为 O(1);
(3)充分利用单链表的有序性,要求算法有较好的时间性能;
(4)分析算法的时空性能,设计测试数据并上机实现。

三、数据结构设计

//节点结构
static class ListNode {
public int val;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
}
//判断集合 A 和 B 是否相等
public boolean isEqual(ListNode curA , ListNode curB)
//求集合 A 和 B 的交集
public ListNode Interest(ListNode curA , ListNode curB)
//求集合 A 和 B 的并集
public ListNode union(ListNode curA , ListNode curB)
//差集
public ListNode subtraction(ListNode curA , ListNode curB)

四、算法设计

(1)判断集合 A 和 B 是否相等
public boolean isEqual(ListNode curA , ListNode curB)
同时遍历A链表和B链表
ListNode pa = curA
ListNode pb = curB
循环条件:pa != null && pb != null
如果pa.val!=pb.val,返回false,如果pa.val=pb.val,pa=pa.next,pb=pb.next,直到循环 结束。如果两个链表都为空,直接返回true,否则返回false.
时间复杂度:O(N)
空间复杂度:O(1)

(2)求集合 A 和 B 的交集
public ListNode Interest(ListNode curA , ListNode curB)
ListNode pa = curA
ListNode pb = curB
首先循环遍历B链表,每遍历一个节点,去遍历链表A,如果A链表的值小于 B节点的值,需要将该节点删除,删除就需要定义prev,让prev指向要删除节点的前驱节点,prev.next = pa.next,当pa.val=pb.val,说明链表A中包含pa节点,让prev = pa,pa=pa.next,pb=pb.next,如果pa.val> pb.val,pb=pb.next.
最终返回A链表的头节点即可。
时间复杂度:O(N^2)
空间复杂度:O(1)

(3)求集合 A 和 B 的并集
public ListNode union(ListNode curA , ListNode curB)
遍历B链表的每个节点,每遍历到一个节点去判断A链表中是否包含该节点如果A链表中该节点,pb=pb.next,同时再次循环A链表中的每个节点,如果A链表中不包含该节点,使用尾插法将该节点插入到A链表中,prev .next = pb; prev = prev.next , prev.next = null;注意,将该链表插入到A链表后,需要将尾节点的next域置null,为了能够找到B链表的下一个节点,需要引入ListNode pbNext = pb.next;,定义在B链表每次进入循环的时候,防止找不到B链表的后续节点。
时间复杂度:O(N^2)
空间复杂度:O(1)

(4)差集
public ListNode subtraction(ListNode curA , ListNode curB)
遍历B链表的每个节点,遍历到每个节点的同时,遍历A链表,如果A链表中包含该节点,需要将该节点删除,如果不包含该节点,继续遍历B链表中的下一个节点即可。
时间复杂度:O(N^2)
空间复杂度:O(1)

五、运行结果 在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、程序源码


```java
public class MyLinkedList {//节点结构static class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val = val;}}public ListNode createList(String str){LinkedList<ListNode> list = new LinkedList<>();for (int i = 0; i < str.length(); i++) {char ch = str.charAt(i);int n = Integer.valueOf(ch)-48;ListNode node = new ListNode(n);list.add(node);}for (int i = 0; i < list.size()-1; i++) {ListNode node  = list.get(i);ListNode node2 =list.get(i+1);node.next = node2;}ListNode last = list.get(list.size()-1);last.next = null;return list.get(0);}//判断集合 A 和 B 是否相等public boolean  isEqual(ListNode curA , ListNode curB){if(curA == null && curB == null){return true;}if(curA != null && curB == null || curA == null && curB !=null){return false;}//curA != null && curB != nullListNode pa = curA;ListNode pb =curB;while(pa != null && pb != null){if(pa.val != pb.val){return false;}pa =pa.next;pb = pb.next;}if(pa == null && pb == null){return true;}else{return false;}}//求集合 A 和 B 的交集/**** @param curA: 表示链表A的头结点* @param curB: 表示链表B的头结点* @return*/public ListNode Interest(ListNode curA , ListNode curB){if(curA == null && curB == null){return null;}if(curA != null && curB == null || curA == null && curB !=null){return null;}//curA != null && curB != nullListNode pa = curA;ListNode pb =curB;ListNode prev =null;while(pa != null && pb !=null){if(pa.val < pb.val){if(pa == curA){curA = curA.next;pa = pa.next;}else {prev.next = pa.next;pa = pa.next;}}else if(pa.val > pb.val){pb = pb.next;}else {prev = pa;pa = pa.next ;pb =pb.next;}}
//        prev.next = null;return curA ;}//求集合 A 和 B 的并集public ListNode union(ListNode curA , ListNode curB){ListNode pb = curB;int flg = 0 ;ListNode prev = null;while(pb != null){ListNode pbNext = pb.next;flg = 0;ListNode pa = curA ;prev = null;while(pa != null){if(pa.val == pb.val){flg = 1;break;}prev = pa;pa = pa.next;}if(flg == 0){prev .next = pb;prev = prev.next;prev.next = null;}pb =pbNext;}return curA;}//差集public ListNode subtraction(ListNode curA , ListNode curB) {ListNode pb =curB;while(pb != null) {ListNode pa =curA;ListNode prev = null;while(pa != null){if(pa.val == pb.val){if(pa == curA){curA = curA.next;}else {prev.next = pa.next;}break;}//不相等,改变前驱节点prev = pa;pa = pa.next;}pb =pb.next;}return curA;}public void print(ListNode cur){while(cur != null){System.out.print(cur.val + " ");cur =cur.next;}System.out.println();}}
public class Test {public static void main(String[] args) {MyLinkedList myLinkedList = new MyLinkedList();System.out.println("请输入链表A的节点:");Scanner scanner = new Scanner(System.in);String strA = scanner.nextLine();System.out.println("请输入链表B的节点:");String strB = scanner.nextLine();MyLinkedList.ListNode curA  =  myLinkedList.createList(strA);MyLinkedList.ListNode curB  =  myLinkedList.createList(strB);System.out.print("链表A和链表B是否相等: ");System.out.println(myLinkedList.isEqual(curA, curB));MyLinkedList.ListNode node =  myLinkedList.Interest(curA, curB);System.out.print("链表A和链表B的交集是: ");myLinkedList.print(node);MyLinkedList.ListNode node2 = myLinkedList.union(curA,curB);System.out.print("链表A和链表B的并集是: ");myLinkedList.print(node2);MyLinkedList.ListNode node3 = myLinkedList.subtraction(curA,curB);System.out.print("链表A和链表B的差集是: ");myLinkedList.print(node3);}
}

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

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

相关文章

实时监控与报警:人员跌倒检测算法的实践

在全球范围内&#xff0c;跌倒事件对老年人和儿童的健康与安全构成了重大威胁。据统计&#xff0c;跌倒是老年人意外伤害和死亡的主要原因之一。开发人员跌倒检测算法的目的是通过技术手段及时发现和响应跌倒事件&#xff0c;减少因延迟救助而造成的严重后果。这不仅对老年人群…

【FPGA约束】如何对fpga进行io约束

对 FPGA 进行 I/O 输入输出约束是确保设计满足电气和物理要求的重要步骤。以下是在 Vivado 环境中设置 I/O 约束的一般步骤&#xff1a; 1. 确定 I/O 引脚需求 根据电路设计和 FPGA 芯片手册&#xff0c;确定每个 I/O 引脚的物理位置、电气特性&#xff08;如电压标准&#x…

Linux学习—Linux服务和守护进程

在Linux系统中&#xff0c;服务和守护进程是保持系统运行的关键组件。服务是运行在后台的程序&#xff0c;通常在系统启动时自动启动&#xff0c;而守护进程是持续运行的程序&#xff0c;用于监听特定的事件或执行定期任务。本文将介绍如何在Linux环境下管理服务和守护进程&…

鸿蒙开发接口安全:【@ohos.security.huks (通用密钥库系统)】

通用密钥库系统 说明 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 向应用提供密钥库能力&#xff0c;包括密钥管理及密钥的密码学操作等功能。 HUKS所管理的密钥可以由应用导入或者由应用调用HUKS接口生成。 导…

Java实现本地缓存

Java实现本地缓存主要还是适用于单体应用&#xff0c;且服务一旦重启&#xff0c;数据都将丢失。 先创建一个缓存类&#xff0c;主要是存放数据和缓存时间&#xff0c;该类的内容或属性可以根据业务自行添加。 Data public class MyCache {/*** 缓存内容*/public String valu…

2024速通python之python面向对象

文章目录 一、类与对象二、构造方法三、toString方法四、__eq__方法&#xff0c;相当于equals五、封装、继承与多态1.封装2.继承3.重写4.类型注解5.多态6.抽象类与抽象方法 「章节总览」       【2024速通python之python基础 https://blog.csdn.net/weixin_45404884/ar…

SpringBoot: 读取项目的Git版本号

在开发项目的时候&#xff0c;我们经常会想要拿到线上运行的程序版本&#xff0c;以确定程序是否正确发布。Spring Boot提供了这样的能力支持。这个能力的核心组件是3个: Maven插件git-commit-id-maven-plugin&#xff0c;用于生成.properties文件&#xff0c;里边包含git的各…

项目部署服务器--浏览器拒绝访问问题

一、检查自己的环境 是本地环境、还是虚拟环境 当您使用 Gunicorn 启动 Flask 应用并监听 0.0.0.0:5000 时&#xff0c;您的 Flask 应用已经可以在服务器上运行并通过该端口提供服务了。但是&#xff0c;0.0.0.0 是一个特殊的 IP 地址&#xff0c;它表示“所有可用的网络接口”…

字节序 大端 小端

字节序&#xff08;Byte Order&#xff09;&#xff0c;指的是在计算机系统中&#xff0c;多字节数据&#xff08;如整数、浮点数&#xff09;在内存中存储时的字节排列顺序。主要有两种类型的字节序&#xff1a;大端字节序&#xff08;Big Endian&#xff09;和小端字节序&…

Windows 包管理器 Chocolatey

1、前言 在Windows上做开发&#xff0c;经常会为频繁安装卸载软件而烦恼&#xff0c;着实有点羡慕Linux和macOS上强大的包管理系统。 今天就来解决这个问题。 什么是包管理器? 包管理器是一种自动安装、配置、升级和卸载软件包的工具。它可以解决手动安装软件的诸多痛点: &…

【C语言】for循环

简介 在C语言中&#xff0c;for循环是一种常用的控制结构&#xff0c;用于重复执行一段代码多次。for循环包括三个部分&#xff1a;初始化表达式、循环条件和更新表达式。 for循环的语法如下&#xff1a; for (初始化表达式; 循环条件; 更新表达式) {// 循环体 }初始化表达式…

C#WPF数字大屏项目实战03--数据内容区域

1、内容区域划分 第一行标题&#xff0c;放了几个文本框 第二行数据&#xff0c;划分成3列布局 2、第1列布局使用UniformGrid控件 最外面放UniformGrid&#xff0c;然后里面放3个GroupBox控件&#xff0c;这3个groupbox都是垂直排列 3、GroupBox控件模板 页面上的3个Group…

计算机网络 —— 数据链路层(无线局域网)

计算机网络 —— 数据链路层&#xff08;无线局域网&#xff09; 什么是无线局域网IEEE 802.11主要标准及其特点&#xff1a; 802.11的MAC帧样式 我们来看看无线局域网&#xff1a; 什么是无线局域网 无线局域网&#xff08;Wireless Local Area Network&#xff0c;简称WLAN…

数仓建模—指标体系分类分级和评价管理

数仓建模—指标体系分类分级和评价管理 前面其实我们提到了指标体系的分类,以及一些指标体系管理相关的内容,今天我们详细的介绍一下相关的知识点 指标 = 业务维度描述 + 技术维度描述 指标,是反映某种事物或现象,描述在一定时间和条件下的规模、程度、比例、结构等概念…

Ivy优化算法-2024年7月SCI一区顶刊新算法!公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化 二、协调有序的种群增…

【宠粉赠书】大模型时代的网络安全:安恒“网安三剑客”实战指南

不知不觉中&#xff0c;小智的粉丝已经突破一万。为了回馈粉丝们的厚爱&#xff0c;今天小智给大家送上一套网络安全界的三宝书——安恒"网安三剑客"。下面我会详细给大家介绍这套图书&#xff0c;文末留有领取方式。 随着人工智能&#xff08;AI&#xff09;和大模型…

finalshell刚连上就断,这个参数你注意到了吗

在实际应用中可能一不下心弄错一个参数就会让你的finalshell刚连上就断&#xff0c;如下图所示。 1、进入ssh目录下&#xff0c;修改ssh_config文件 2、修改UseDNS no,并把前面的#去掉。 注&#xff1a;如果在ssh_config文件见不到UseDNS yes ,可以打开sshd_config,他们是在…

Vue 2 + Element UI 选择一个el-select清空另一个el-select选中的值

需求&#xff1a;表单中有两个下拉选择器&#xff0c;先选中第一个&#xff0c;清空第二个选中的值 尝试过this.$refs[form].resetFields(field name);全都失效&#xff01; 效果图如下&#xff1a; 先选择商品分类&#xff0c;再去选择商品列表中的某一件商品 <el-form-…

园区运营管理平台的功能架构

产业园区作为推动地方经济发展的重要载体&#xff0c;其运营管理水平直接影响到园区的竞争力和可持续发展能力&#xff0c;园区运营管理平台作为园区的运营管理工具&#xff0c;旨在通过智能化、自动化的手段提升园区的运营效率和服务水平。 园区运营管理平台不仅为园区管理者提…

JavaScript中this方法;var,let,constd区别;JSON是什么

this方法 1、在对象方法中&#xff0c; this 指向调用它所在方法的对象。 2、单独使用 this&#xff0c;它指向全局(Global)对象。 3、函数使用中&#xff0c;this 指向函数的所属者。 4、严格模式下函数是没有绑定到 this 上&#xff0c;这时候 this 是 undefined。 5、在 HT…