数据结构(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];//桶的数等于length
    int 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->6
    2->1->3->5->6
L-head L-tail r-head r-tail

public 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){//小于x
            if(leftTail==null){
                leftFirst=p;
                leftTail=p;
            }else{
                leftTail.next=p;
                leftTail=leftTail.next;
            }
        }else{//大于x
        if(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-equeal

public ListNode check(ListNode head){
    ListNode p=head;//传一个链表
    HashSet set=new HashSet();//hashset
    while(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.mfbz.cn/a/569792.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的游艇停泊系统

一、系统架构 前端&#xff1a;vue2 | element-ui |html 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. web端-登录 02. web端-系统首页1 03. web端-系统首页2 04. web端-泊位 05. web…

YashanDB V23.2 LTS发版 | 共享集群首个长期支持版本

4月&#xff0c;YashanDB正式发布长期支持版本YashanDB V23.2 LTS&#xff0c;标志着YashanDB单机主备、共享集群和分布式实时数仓等完整产品体系&#xff0c;已全面进入可规模化使用的长期支持阶段&#xff1b;同时配套数据迁移工具、监控运维工具和开发者工具&#xff0c;可以…

串口服务器和光纤交换机的区别

串口服务器与光纤交换机在功能和应用上存在显著区别。串口服务器主要实现串口设备与以太网设备之间的数据转换与传输&#xff0c;适用于远程监控、数据采集等场景&#xff1b;而光纤交换机则专注于高速光纤网络中的数据交换&#xff0c;为大型企业或数据中心提供稳定、高效的数…

基于Google Gemini 探索大语言模型在医学领域应用评估和前景

概述 近年来&#xff0c;大规模语言模型&#xff08;LLM&#xff09;在理解和生成人类语言方面取得了显著的飞跃&#xff0c;这些进步不仅推动了语言学和计算机编程的发展&#xff0c;还为多个领域带来了创新的突破。特别是模型如GPT-3和PaLM&#xff0c;它们通过吸收海量文本…

LearnOpenGL(四)之纹理

一、纹理 纹理是一个2D图片&#xff08;甚至也有1D和3D的纹理&#xff09;&#xff0c;它可以用来为每个顶点添加颜色来增加图形的细节&#xff0c;从而创建出有趣的图像。 纹理坐标在x和y轴上&#xff0c;范围为0到1之间&#xff08;注意我们使用的是2D纹理图像&#xff09;…

Maven如何解决jar包冲突的问题?

在使用Maven进行项目构建的应用中&#xff0c;如果在应用运行期发生了NoSuchMethodError、ClassNotFoundException等异常或者错误时&#xff0c;需要考虑Jar包冲突的问题。 如果在应用中&#xff0c;我们同时依赖了两个第三方的jar包A&#xff0c;B&#xff0c;而A&#xff0c;…

制造企业如何打造客户服务核心竞争力?[AMT企源典型案例]

引言 产品同质化严重&#xff0c;竞争的焦点从产品转向服务&#xff0c;企业的管理模式也要相应转变。那么如何打造围绕服务的核心竞争力&#xff1f;相信以下案例会给大家一些启发。 项目背景&#xff1a; 售后服务在市场竞争中的作用凸显 A公司是一家医疗器械生产制造企业…

LeetCode 热题 100 Day04

矩阵相关题型 Leetcode 73. 矩阵置零【中等】 题意理解&#xff1a; 将矩阵中0所在位置&#xff0c;行|列置换为全0 其中可以通过记录0元素所在的行、列号&#xff0c;来标记要置换的行|列 将对应位置置换为0 解题思路&#xff1a; 第一个思路&#xff1a; 可以…

02 VMware下载安装银河麒麟(Kylin)系统

02 VMware下载&安装银河麒麟&#xff08;Kylin&#xff09;系统 一、官网1、官网地址 二、下载1、官网下载&#xff08;1&#xff09;服务器操作系统&#xff08;2&#xff09;申请试用&#xff08;3&#xff09;产品试用申请&#xff08;4&#xff09;点击下载连接即可 2、…

单链表进阶题目,点进来看一下这些题你都会吗

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

项目实践---贪吃蛇小游戏(下)

对于贪吃蛇小游戏&#xff0c;最主要的还是主函数部分&#xff0c;这里就和大家一一列举出来&#xff0c;上一章已经写过头文件了&#xff0c;这里就不多介绍了。 首先就是打印桌面&#xff0c;也就是背景&#xff0c;则对应的代码为&#xff1a; void SetPos(short x, short …

huggingface模型下载至本地并调用教程

huggingface内有许多预训练模型&#xff0c;可以在线调用模型或者将模型部署至本地&#xff0c;但有时候通过网址调用模型会很慢&#xff0c;有些服务器甚至无法通过网址调用… 那么&#xff0c;正题&#xff0c;如何将huggingface的模型部署至本地呢&#xff1f;其实很简单&am…

el-image组件预览图片同时操作页面

背景&#xff1a;el-image组件打开预览效果不能滑动页面。 Q:那么如何才能在打开遮罩层后还能操作页面呢&#xff1f; A:改变遮罩层的大小。CSS3有一个属性width&#xff1a;fit-content&#xff1b;可以解决这个问题。 打开F12看看饿了么的原生样式如下 加上width&#xff1…

R可视化:ggplot2绘制双y轴图

介绍 ggplot2绘制双y轴图加载R包 knitr::opts_chunk$set(message = FALSE, warning = FALSE) library(tidyverse) library(readxl)# rm(list = ls()) options(stringsAsFactors = F) options(future.globals.maxSize = 10000 * 1024^2)Importing data 下载Underdetection of c…

网页自动跳转到其他页面,点击浏览器返回箭头,回不到原来页面的问题

背景&#xff1a;今天产品提个需求&#xff0c;需要从index页面自动触发跳转到下一页面的事件&#xff0c;从而不做任何操作&#xff0c;直接跳转到test页面。 代码是这样的&#xff1a; index.vue: <template><div style"width:500px;height:600px;background-…

(三)Servlet教程——Tomcat安装与启动

首先打开浏览器在浏览器地址栏中输入清华大学开源软件镜像站地址&#xff0c;地址如下 https://mirrors.tuna.tsinghua.edu.cn/ 输入地址后回车会出现如下图所示的界面 在该界面找tomcat不是很好找&#xff0c;在搜索框中输入apache然后回车&#xff0c;输入apache后并回车后出…

WebSocket的原理、作用、API、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 原理作用客户端 API服务端 API生命周期常见注解SpringBoot示例 WebSocket是一种 通信协议 &#xff0c;它在 客户端和服务器之间建立了一个双向通信的网络连接 。WebSocket是一种基于TCP连接上进行 全双工通信 的 协议 。 WebSocket允许客户端和服务器在 单个TCP连接上…

AI道路交通违章智能抓拍系统解决方案

项目概述 背景 目前&#xff0c;XX市市全市民用汽车保有量94.62万辆&#xff0c;比上年末增长15.9%&#xff0c;其中私人汽车保有量35.48万辆&#xff0c;减少0.01%。轿车保有量39.45万辆&#xff0c;增长82.1%&#xff0c;其中私人轿车38.65万辆&#xff0c;增长82.1%。电动自…

【项目实战】基于高并发服务器的搜索引擎

【项目实战】基于高并发服务器的搜索引擎 目录 【项目实战】基于高并发服务器的搜索引擎搜索引擎部分代码index.htmlindex.hpplog.hppparser.cc&#xff08;用于对网页的html文件切分且存储索引关系&#xff09;searcher.hpputil.hpphttp_server.cc&#xff08;用于启动服务器和…

免费https证书申请

HTTPS证书&#xff0c;也称为SSL证书&#xff08;Secure Sockets Layer&#xff09;或TLS证书&#xff08;Transport Layer Security&#xff09;&#xff0c;是一种数字证书&#xff0c;用于在互联网通信中确保数据传输的安全性、完整性和真实性。它是基于公钥基础设施&#x…