数据结构(data structure)(2)链表的运用

桶排序

e*len/(max+1)
e为每个元素,根据上式判断该元素放入哪个桶
桶排序适用于分布均匀的数组1.arr->length,max
2.Node[]-new Node[length]
3.扫描->hash->下标->元素入桶
4.出桶<=>排序排序的输出private void sort(int[] arr){int length=arr.length;LinkedNode[] bucket=new LinkedNode[length];//桶的数等于lengthint max=Util.maxOf(arr);//求max//入桶for(int i=0;i<length;i++){int value=arr[i];//扫描每个元素int hash=hash(arr[i],max,length);//桶的下标if(bucket[hash]==null){//初始化链表表头bucket[hash]=new LinkedNode(value);}else{insertInto(value,bucket[hash],bucket,hash);//插入链表}}int k=0;//记录数组下标//出桶for(LinkedNode node:bucket){if(node!=null){while(node!=null){//遍历整个桶arr[k++]=node.value;node=node.next;}}}}private void insertInto(int value,LinkedNode head,LinkedNode[] bucket,int hash){LinkedNode newNode=new LinkedNode(value);//小于头节点,放在头上if(value<=head.value){//替换头节点bucket[hash]=newNode;return;}//往后找第一个比当前值大的结点,放在这个结点的前面LinkedNode p=head;LinkedNode pre=p;while(p!=null&&value>p.value){pre=p;p=p.next;}if(p==null){//搜到末尾了pre.next=newNode;}else{//插入pre和p之间pre.next=newNode;newNode.next=p;}}

删除重复元素

//创建链表
//单向链表
class Node{Node next=null;int data;public Node(int d){data=d;}
}void appendToTail(int d){Node end=new Node(d);Node n=this;while(n.next!=null){n=n.next;}n.next=end;
}

移除未排序链表中的重复部分

 

拉链法散列=hash
若hash表已经标记过,就删除
public class RemovRepeation{public static void main(String[] args){int[] data={1,6,7,3,6};Node head=new Node(null);Node p=head;for(int i=0;i<data.length;i++){p.next=new Node(data[i]);p=p.next;}rr(head);//移除重复Node p1=head.next;while(p1!=null){System.out.println(p1.value);p1=p1.next;}private static void rr(Node head){HashSet set=new HashSet();Node pre=head;Node p1=head.next;while(p1!=null){if(set.contains(p1.value)){//存在,说明重复->删除pre.next=p1.next;}else{set.add(p1.data);}p1=p1.next;}}private static class Node{Node next;Object value;public Node(Object value){this.value=value;}}
}

删除倒数第k个元素

 

public class  KtNode{//特别要注意边界地问题public ListNode FindeKthToTail(ListNode head,int k){if(head==null||k<=0){return null;}ListNode p1=head;ListNode p2-head;int count=0;while(count<k){//先让p2到第k+1个结点上p2=p2.next;count++;}while(p2!=null){//两个指针相差k个结点距离p1=p1.next;//两指针同时平移p2=p2.next;//当p2到null,p1就到了倒数第k个结点}System.out.println(p1.val);return p1;}public static void main(String[] args){int[] arr={1,2,3,4,5}ListNode head=new ListNode(0);for(int i=0;i<arr.length;i++){p.next=new ListNode(arr[i]);p=p.next;}System.out.println(head);obj.FindKthToTail(head,3);}
}

删除单项链表中的某节点

若该节点为尾结点,返回false,否则true
public class _2_3RemoveNode3{public boolean removeNode(ListNode pNode){if(pNode next==null){return false;pNode.val=pNode.next.val;//复制后继的内容pNode.next=pNode.next.next;//跨越后继return true;}}
}

以给定值x为基准将链表分割为两部分,所有小于x的结点排在大于或等于x的结点之前
给定一个链表的头指针ListNode* pHead,请返回重新排列后的链表的头指针

 

注意分割后2->3->4->5->62->1->3->5->6
L-head L-tail r-head r-tailpublic ListNode parttition(ListNode pHead,int x){ListNode leftTail=null;ListNode rightTail=null;ListNode p=pHead;ListNode leftFirst=null;ListNode rightFirst=null;while(p!=null){//顺序扫描所有结点·   int pValue=p.val;if(pvalue<x){//小于xif(leftTail==null){leftFirst=p;leftTail=p;}else{leftTail.next=p;leftTail=leftTail.next;}}else{//大于xif(rightTail==null){rightFirst=p;rightTail=p;}else{rightTail.next=p;rightTail=rightTail.next;}}p=p.next;}if(leftFirst==null){//左边链表可能为空return rightFirst;}leftTail.next=rightFirst;//左右两个链表连接起来if(rightTail!=null){rightTail.next=null;}return leftFirst;
}

有两个用链表来表示的整数,每个结点包含一个数位
这些数位是反向存放的,也就是个位排在链表的首位,编写函数对这两个整数求和

 

给定两个链表ListNode* A ListNode* B请返回A+B的结果(ListNode*)
public ListNode plusAB(ListNode a,ListNode b){return plusAB(a,b,0);}public ListNode plusAB(ListNode a,ListNode b,int i){if(a==null&&b==null&&i==0)return null;int  value=i;if(a!=null){value+=a.val;}if(b!=null){value+=b.val;}ListNode result=new ListNode(value%10);result.next=plusAB(a==null?null:a.next,b==null?null:b.next,value>=10?1:0)
//递归链表return result;
}

给定一个有环链表,实现一个算法返回环路的开头结点

 

 有环链表的定义在链表中某个结点的next元素指向在它前面出现过的结点则表明该链表存在环路HashSet判断重复,判断元素是否存在
hash-equealpublic ListNode check(ListNode head){ListNode p=head;//传一个链表HashSet set=new HashSet();//hashsetwhile(true){if(set.contains(p))return p;//遍历链表,如果存在相同结点,则退出else{set.add(p);p=p.next;}//不存在相同结点,则加入hashset,链表继续往下面遍历}
}快慢指针
S一步一进,f两步一进=》s,f相遇于某一点
如果存在环,必定在某一点相遇,若是没有环,则不相遇
public boolean hashCircle(ListNode head){ListNode s=head;ListNode f=head;while(true){s=s.next;f=f.next.next;if(s==f)return true;if(s==null||f==null||f.next==null)return false;}
}
s和f相聚于何处
f差l-k步
s走l-k步后相遇
他们离的起点还有k步
public ListNode beginOfCircle(ListNode head){ListNode s=head;ListNode f=head;while(f!=null&&f.next!=null){s=s.next;f=f.next.next;if(s==f)break;}//何种方式退出的?if(f==null||f.next==null){return null;   `}ListNode p=head;while(p!=s){p=p.next;s=s.next;}return p;
}

回文链表

 

检查链表是否回文翻转链表
a->b->c->b->a
a b c c b a
借助栈,一半入栈,一半匹配出栈
前半部分压栈public boolean isPalindrome(ListNnode,pHead){if(pHead==null){return false;}if(pHead.next=null){return true;}ListNode slower=pHead;ListNode faster=pHead;Stack<ListNode>stack=new Stack<>();boolean isOdd=true;while(faster!=null&&faster.next!=null){stack.push(slower);//压栈slower=slower.next;faster=faster.next.next;if(faster==null){isOdd=false;}}//奇数个结点,slower还要next一下if(isOdd)slower=slower.next;while(!stack.empty()){if(stack.pop().val!=slower.val){return false;}else{slower=slower.next;}}
}

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

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

相关文章

漆包线行业你了解多少?专业漆包线行业MES生产管理系统

今天就说说漆包线行业&#xff0c;漆包线是工业电机&#xff08;包括电动机和发电机&#xff09;、变压器、电工仪表、电力及电子元器件、电动工具、家用电器、汽车电器等用来绕制电磁线圈的主要材料。 漆包线上游是铜杆行业&#xff0c;下游是各种消费终端&#xff0c;主要是电…

Java基础知识总结(66)

** FileOutputStream练习 */ public class FileOutputStreamDemo { public static void main(String[] args) { String path "D:\\IoDemo\\test2.txt"; //如果文件不存在&#xff0c;则自动创建 //append:是指是否在原有内容后追加&#xff0c;默认为FALSE try(Outp…

Python代码实战——深入解析缓存问题:穿透、击穿、雪崩

作为Python开发者处理缓存相关问题,可以通过具体的场景和代码示例来更好地理解和解决缓存穿透、缓存击穿和缓存雪崩。 缓存穿透 场景:用户频繁请求数据库中不存在的数据,导致每次请求都绕过缓存直接查询数据库,增加数据库的压力。 解决方案: 设置空值缓存:当查询数据不…

代码优化实践之税率计算问题

开篇 今天的问题来自于《编程珠玑》第三章【数据决定程序结构】&#xff0c;这里提出了几条代码优化相关的原则&#xff0c;受益不浅。下面是提到的几条原则&#xff1a; 使用数组重新编写重复代码。冗长的相似代码往往可以使用最简单的数据结构——数组来更好的表述&#xff1…

C++入门之类和对象(中)

C入门之类和对象(中) 文章目录 C入门之类和对象(中)1. 类的6个默认对象2. 构造函数2.1 概念2.2 特性2.3 补丁 3. 析构函数3.1 概念3.2 特性3.3 总结 4. 拷贝构造函数4.1 概念4.2 特性4.3 总结 1. 类的6个默认对象 如果一个类中什么都没有&#xff0c;那么这个类就是一个空类。…

什么是代理IP?如何正确使用代理IP?

代理IP&#xff08;Proxy IP&#xff09;是一种网络技术&#xff0c;它允许用户通过一个中介服务器&#xff08;即代理服务器&#xff09;来访问互联网。具体来说&#xff0c;代理IP隐藏了用户的真实IP地址&#xff0c;使用第三方的IP地址进行网络访问。当用户发起网络请求时&a…

CAD小软件diy-读柴油机壳体装配图

读取一个柴油机壳体dxf图纸&#xff0c;一般这种装配体轮廓曲线都是用直线和圆弧拟合的&#xff0c;全部都是显示的白色实现&#xff0c;发现有线段间隙&#xff0c;拖动线段补上间隙。 这个测试放在蓝奏云上面 https://wwf.lanzout.com/ip1Xx1vvhbkh

tcp bbr pacing 的对与错

前面提到 pacing 替代 burst 是大势所趋&#xff0c;核心原因就是摩尔定律逐渐失效&#xff0c;主机带宽追平交换带宽&#xff0c;交换机不再能轻易吸收掉主机突发&#xff0c;且随着视频类流量激增&#xff0c;又不能以大 buffer 做带宽后备。因此&#xff0c;主机必须 pacing…

A-1:树状数组

A-1:树状数组 1.介绍Q1:树状数组解决什么问题&#xff1f;Q2:树状数组的使用1.前置知识&#xff1a;lowbit(x)2.单点修改3.求[1,n]的和4.区间查询5.hh Q3:树状数组是否优化了Q4:上图上例子解释上面说的东西(Important) 2.习题练习 1.介绍 树状数组是一个比较难以理解的高级数据…

什么存算分离?

存算分离&#xff08;Storage-Compute Separation 或 Storage-Compute Decoupling&#xff09;是一种数据架构设计理念&#xff0c;旨在将数据存储&#xff08;Storage&#xff09;和数据处理/计算&#xff08;Compute&#xff09;功能分离开来。这种设计允许存储资源和计算资源…

python笔记之高级特性

目录 一、is 与 二、深浅拷贝 三、生成器&#xff08;generator&#xff09; 1、列表推导式 2、列表生成器 3、函数生成器 四、迭代器 可迭代对象 五、闭包&#xff08;closure&#xff09; 六、装饰器 一、is 与 比较运算符。是用来比较两个值的大小的。&#xf…

C语言---单链表(二)

文章目录 前言1.准备工作2,打印链表、创建新的节点、销毁链表2.1.打印链表2.2.创建节点2.3.销毁链表 3.尾插、头插、尾删、头删3.1.尾插3.2.头插3.3.尾删3.4.头删 4.在特殊位置之前、之后插入、删除以及查找节点4.1.查找节点4.2.在指定位置之前插入4.3.在指定位置之后插入数组4…

赋值运算符

介绍 赋值运算符就是将某个运算后的值&#xff0c; 赋给指定的变量。 赋值运算符的分类 基本赋值运算符 例如&#xff1a; int a 10; 复合赋值运算符 &#xff0c; - &#xff0c; * &#xff0c; / &#xff0c; % 等 a b; [等价 a a b; ] a - b; [等价 a a - b; ] …

亚信安全入选中国数据安全市场图谱

近日&#xff0c;全球领先的IT市场研究和咨询公司IDC发布了《IDC Market Glance&#xff1a;中国数据安全市场图谱&#xff0c;2024》报告&#xff08;以下简称“报告”&#xff09;&#xff0c;报告展示了中国数据安全市场的构成和格局&#xff0c;遴选出不同细分市场领域的主…

C语言中的结构体:从定义到传递

前言 结构体是C语言中一种重要的数据类型&#xff0c;它允许我们将不同类型的数据组合成一个整体&#xff0c;并以自定义的方式进行操作。通过结构体&#xff0c;我们可以更加灵活地管理和处理复杂的数据结构&#xff0c;从而提高程序的可读性和可维护性。本篇博客将从结构体的…

jetcache fastjson 泛型复杂对象JSON序列 ,反序列化

Jetcache fastjson 泛型复杂对象JSON序列 ,反序列化 默认的FastJson2 序列化存在问题增强FastJson 支持Encode 编码器Decode 解码器 默认的FastJson2 序列化存在问题 默认的序列化不能转换List 中的泛型数据类型, 从缓存拿取的list集合对象数据全部都转换成了JSONObject 增强F…

nginx--Nginx转发真实的IP

Nginx转发真实的IP 前言给nginx.conf 设置proxy_set_headerjava 程序里获取 前言 在使用nginx的时候可能会遇到判断是不是本机在做操作&#xff0c;这样的话web端我们是可以通过ip和端口进行远程连接的这样的话我们就需要从后端获取到真实ip来判断是不是指定的机器了&#xff…

Linux 序列化、反序列化、实现网络版计算器

目录 一、序列化与反序列化 1、序列化&#xff08;Serialization&#xff09; 2、反序列化&#xff08;Deserialization&#xff09; 3、Linux环境中的应用实例 二、实现网络版计算器 Sock.hpp TcpServer.hpp Jsoncpp库 Protocol.hpp 类 Request 类 Response 辅助函…

稳压二极管仿真实验

稳压二极管仿真实验 1、稳压管稳压实验 用Multisim搭建如下的仿真电路图&#xff0c;选用5.1V的稳压管&#xff0c;12V的直流电源&#xff0c;开启仿真后&#xff0c;12V电压将稳压管击穿&#xff0c;稳压管将两端的电压稳压到5.07V&#xff0c;该电压与限流电阻R1的阻值有关…

js操作dom元素

当使用JavaScript操作DOM时&#xff0c;可以通过各种方法来实现对元素的获取、修改、创建、删除等操作。以下是一些详细的代码示例&#xff1a; 1. 获取元素 javascript复制代码 // 通过ID获取元素 var elementById document.getElementById(myElementId); // 通过类名获取元…