自定义实现Java ListNode链表

2023-10-26

写在前面

今天写代码的时候,发现我居然被Java的ListNode的输入卡了半天,所以就打算写一篇博客来整理一下ListNode。

链表的定义

首先ListNode就是链表,它的基本结构如下:
在这里插入图片描述
及一个包含数据,和指针的结构,我们将一个节点的指针的节点指向下一个节点,这样就形成了一串链式结构,并称之为:链表。

所以对于链表的定义如下:


/**
 * Java ListNode 链表的各种定义方法
 * 
 * @作者(yequan17)
 * @版本(2021.12.6)
 */
public class JListNode
{
    /**
     * 基本结构
     */
    class ListNodeBasicStructure{         //类名:Java类就是一种自定义的数据结构。
        int val;                          //数据:节点数据。
        ListNodeBasicStructure next;      //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
    }
    
    /**
     * 添加构造方法方便初始化
     */
    class ListNodeConstructor{            //类名:Java类就是一种自定义的数据结构。
        int val;                          //数据:节点数据。
        ListNodeConstructor next;         //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
        
        ListNodeConstructor(int val){     //构造方法:构造方法和类名相同
            this.val=val;                 //把接收的参数赋值给当前类的val变量
        }
    }
    
    /**
     * 范型写法:使用范型可以兼容不同的数据类型
     */
    class ListNodeParadigm<E>{            //类名:Java类就是一种自定义的数据结构。
        E val;                            //数据:节点数据。
        ListNodeParadigm<E> next;         //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
        
        ListNodeParadigm(E val){          //构造方法:构造方法和类名相同
            this.val=val;                 //把接收的参数赋值给当前类的val变量
        }
    }
    
}

我们逐个来看:

	/**
     * 基本结构
     */
    class ListNode{         //类名:Java类就是一种自定义的数据结构。
        int val;            //数据:节点数据。
        ListNode next;      //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
    }

这是最基本的链表结构,即一个数据一个指向下一个节点的指针或者说是指向下一个节点对象的引用。

但是这不并能满足我们的需要,因为我们在使用一个对象前必须对其进行初始化,如果不初始化,Java也会对其进行初始化。
所以我们将其修改为:

/**
     * 添加构造方法方便初始化
     */
    class ListNode{            //类名:Java类就是一种自定义的数据结构。
        int val;                          //数据:节点数据。
        ListNode next;         //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
        
        ListNode(int val){     //构造方法:构造方法和类名相同
            this.val=val;                 //把接收的参数赋值给当前类的val变量
        }
    }

这就足够了吗?当然不是,有时候我们需要的可能并不是一个包含整型数据的链表,它也可能是浮点型,甚至是一个一个对象,所以就有了范型下链表的表示:

/**
     * 范型写法:使用范型可以兼容不同的数据类型
     */
    class ListNode{            //类名:Java类就是一种自定义的数据结构。
        E val;                            //数据:节点数据。
        ListNode<E> next;         //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
        
        ListNode(E val){          //构造方法:构造方法和类名相同
            this.val=val;                 //把接收的参数赋值给当前类的val变量
        }
    }

链表的基本操作

好的在上面我们已经知道了链表是如何定义的,那么接下来,我们就来对链表进行一些最基本的在操作吧,它包括遍历链表、插入一个新的节点、置换一个节点和删除一个节点。

我们先来看链表的遍历。
在这里插入图片描述
再看一遍链表的结构,遍历链表就像遍历数组一样,从头到尾一个一个走就行,和数组不一样的是,我们遍历数组是根据数组的下标从零开始,依次前进。那么如何遍历链表呢?

我们发现,现在有两个问题摆在我们的面前:

  1. 怎么找到链表的头部,或者说,遍历应该从哪里开始呢?
  2. 怎么找到链表的尾部,或者说,遍历何时结束呢?

这个问题其实很好解决。
我们只需要将链表的第一个节点定义为head,头节点,然后将它后面的节点定义为head.next,再后面的就是head,next.next,当然我们并不需要怎么写,我们可以定义一个中间节点nextNode用来表示当前节点,然后每一次将nextNode.next指向nextNode。这么说可能有些抽象,我们不妨来看一下图解:

首先,我们定义一个nextNode,并让它指向head,即nextNode=head
在这里插入图片描述

接着我们生成一个新的节点node,并让nextNode.next指向这个node,即nextNode.next=node
再让nextNode=nextNode.next,即将当前节点的位置向后移动一个,便得到了:
在这里插入图片描述
依次类推,便可以向后遍历链表了,那么如何结束呢?
其实也很简单,因为,最后一个节点的下一个节点为空,这就是一个判断结束的标志,即nextNode.next==null时,就遍历结束。

接下来,我们来看一个创建链表、为其赋值,再将其输出的例子:


/**
 * Java ListNode 链表的创建与遍历
 * 
 * @作者(yequan17)
 * @版本(2021.12.6)
 */
public class JListNodeTraverse
{
    /**
     * 定义链表
     */
    static class ListNode{                //类名:Java类就是一种自定义的数据结构。
        int val;                          //数据:节点数据。
        ListNode next;                    //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
        
        ListNode(int val){                //构造方法:构造方法和类名相同
            this.val=val;                 //把接收的参数赋值给当前类的val变量
        }
    }
    
    /**
     * 创建链表及遍历链表
     */
    public static void main(String[] args){
         
        ListNode head=new ListNode(0);   //创建头节点
        ListNode nextNode;               //声明一个变量用来在移动过程中指向当前节点
        nextNode=head;                   //指向头节点
        
        //创建链表
        for(int i=1;i<10;i++){
            ListNode node=new ListNode(i);//生成新的节点
            nextNode.next=node;           //把节点连起来
            nextNode=nextNode.next;       //把当前节点往后移动
        }//当for循环完成之后,nextNode指向最后一个节点
        
        nextNode=head;//重现赋值让它指向头节点
        print(nextNode);//打印输出
    }
    
    static void print(ListNode listNode){
        //创建链表节点
        while(listNode!=null){
            System.out.println("节点:"+listNode.val);
            listNode=listNode.next;
        }
        System.out.println();
    }
}

好看完了遍历,我们来看一下链表的一个很重要的方法,插入节点。
在这里插入图片描述如何在这样的一个链表中插入节点呢?
直观的理解就是:
在这里插入图片描述
所以,如果我们需要在nextNode后面插入一个新的节点newnode,那么我们需要做的第一件事就是将nextNode的下一个节点保存下来,为什么要这么做呢?
因为,单链表中,我们只能根据前一个节点来找到它的下一个节点,而不能更具一个节点找到它前面的节点。
所以,我们需要先将nextNode.next保存下来,可以记为node。
接着让nextNode.next指向newnode,即nextNode.next=newnode,这样我们就在nextNode后面加上了一个新的节点,但这还没完,我们还需要将整个链表剩下的部分接回来,所以,我们可以让newnode指向我们之前保存的node,即newnode.next=node,而对于node,它后面的节点没有发生变化,所以就有了一条新的链表。

代码如下:


/**
 * Java ListNode 链表的创建与插入节点
 * 
 * @作者(yequan17)
 * @版本(2021.12.6)
 */
public class JListNodeInsert
{
    /**
     * 定义链表
     */
    static class ListNode{                //类名:Java类就是一种自定义的数据结构。
        int val;                          //数据:节点数据。
        ListNode next;                    //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
        
        ListNode(int val){                //构造方法:构造方法和类名相同
            this.val=val;                 //把接收的参数赋值给当前类的val变量
        }
    }
    
    /**
     * 创建链表及在链表特定位置插入新的节点
     */
    public static void main(String[] args){
         
        ListNode head=new ListNode(0);   //创建头节点
        ListNode nextNode;               //声明一个变量用来在移动过程中指向当前节点
        nextNode=head;                   //指向头节点
        
        //创建链表
        for(int i=1;i<10;i++){
            ListNode node=new ListNode(i);//生成新的节点
            nextNode.next=node;           //把节点连起来
            nextNode=nextNode.next;       //把当前节点往后移动
        }//当for循环完成之后,nextNode指向最后一个节点
        
        nextNode=head;//重现赋值让它指向头节点
        print(nextNode);//打印输出
        
        while(nextNode!=null){
            if(nextNode.val==5){
                ListNode newnode=new ListNode(99);//生成新的节点
                ListNode node=nextNode.next;//先保存下一个节点
                nextNode.next=newnode;//插入新节点
                newnode.next=node;//新节点的下一个节点指向之前保存的节点
            }
            nextNode=nextNode.next;
        }//循环完成之后,nextNode指向最后一个节点
        nextNode=head;//重新赋值让它指向头节点
        print(nextNode);//打印输出
    }
    
    static void print(ListNode listNode){
        //创建链表节点
        while(listNode!=null){
            System.out.println("节点:"+listNode.val);
            listNode=listNode.next;
        }
        System.out.println();
    }
}

好,看完了插入,我们来看一下如何替换一个节点呢?
思路同上,我们同样要先保存链表的后半截,但这个后半截是从要被替换节点的后面开始的,即从node.next开始,所以,我们可以直接定义node为要被替换节点的下一个节点,套用上面插入的操作就是,node=nextNode.next.next,然后同上面一样操作,当然也要注意一点,我们是在进行替换操作,所以应该将被替换节点从整个链表中取出,或者说删除,那么很简单,我们只需要在最开始就让nextNode.next.next指向空就行,即nextNode.next.next=null。
在这里插入图片描述

所以代码如下:


/**
 * Java ListNode 链表的创建与替换节点
 * 
 * @作者(yequan17)
 * @版本(2021.12.6)
 */
public class JListNodeChange
{
    /**
     * 定义链表
     */
    static class ListNode{                //类名:Java类就是一种自定义的数据结构。
        int val;                          //数据:节点数据。
        ListNode next;                    //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
        
        ListNode(int val){                //构造方法:构造方法和类名相同
            this.val=val;                 //把接收的参数赋值给当前类的val变量
        }
    }
    
    /**
     * 创建链表及在链表特定位置插入新的节点
     */
    public static void main(String[] args){
         
        ListNode head=new ListNode(0);   //创建头节点
        ListNode nextNode;               //声明一个变量用来在移动过程中指向当前节点
        nextNode=head;                   //指向头节点
        
        //创建链表
        for(int i=1;i<10;i++){
            ListNode node=new ListNode(i);//生成新的节点
            nextNode.next=node;           //把节点连起来
            nextNode=nextNode.next;       //把当前节点往后移动
        }//当for循环完成之后,nextNode指向最后一个节点
        
        nextNode=head;//重现赋值让它指向头节点
        print(nextNode);//打印输出
        
        while(nextNode!=null){
            if(nextNode.val==5){
                ListNode newnode=new ListNode(99);//生成新的节点
                ListNode node=nextNode.next.next;//先保存要替换节点的下一个节点
                nextNode.next.next=null;//被替换节点指向为空,等待Java垃圾回收
                nextNode.next=newnode;//插入新节点
                newnode.next=node;//新节点的下一个节点指向之前保存的节点
            }
            nextNode=nextNode.next;
        }//循环完成之后,nextNode指向最后一个节点
        nextNode=head;//重新赋值让它指向头节点
        print(nextNode);//打印输出
    }
    
    static void print(ListNode listNode){
        //创建链表节点
        while(listNode!=null){
            System.out.println("节点:"+listNode.val);
            listNode=listNode.next;
        }
        System.out.println();
    }
}

通过上面的操作,我们对链表已经很熟悉了,因此,删除某一个节点的操作其实就是将当前节点nextNode直接指向后面的后面的节点,我们定义即nextNode后面的后面的节点为listnode,即listnode=nextNode.next.next,然后删除中间节点,那么nextNode.next=listnode。
在这里插入图片描述
代码如下:


/**
 * Java ListNode 链表的创建与删除节点
 * 
 * @作者(yequan17)
 * @版本(2021.12.6)
 */
public class JListNodeDelete
{
    /**
     * 定义链表
     */
    static class ListNode{                //类名:Java类就是一种自定义的数据结构。
        int val;                          //数据:节点数据。
        ListNode next;                    //对象:引用下一个节点对象。在Java中没有指针的概念,Java中的引用和C语言的指针类似。
        
        ListNode(int val){                //构造方法:构造方法和类名相同
            this.val=val;                 //把接收的参数赋值给当前类的val变量
        }
    }
    
    /**
     * 创建链表及在链表特定位置插入新的节点
     */
    public static void main(String[] args){
         
        ListNode head=new ListNode(0);   //创建头节点
        ListNode nextNode;               //声明一个变量用来在移动过程中指向当前节点
        nextNode=head;                   //指向头节点
        
        //创建链表
        for(int i=1;i<10;i++){
            ListNode node=new ListNode(i);//生成新的节点
            nextNode.next=node;           //把节点连起来
            nextNode=nextNode.next;       //把当前节点往后移动
        }//当for循环完成之后,nextNode指向最后一个节点
        
        nextNode=head;//重现赋值让它指向头节点
        print(nextNode);//打印输出
        
        while(nextNode!=null){
            if(nextNode.val==5){
                ListNode listnode=nextNode.next.next;//先保存要删除节点的下一个节点
                nextNode.next.next=null;//被替换节点指向为空,等待Java垃圾回收
                nextNode.next=listnode;//指向被删除节点的下一个节点
            }
            nextNode=nextNode.next;
        }//循环完成之后,nextNode指向最后一个节点
        nextNode=head;//重新赋值让它指向头节点
        print(nextNode);//打印输出
    }
    
    static void print(ListNode listNode){
        //创建链表节点
        while(listNode!=null){
            System.out.println("节点:"+listNode.val);
            listNode=listNode.next;
        }
        System.out.println();
    }
}

总结

ListNode虽然看起来不想数组那么简约,但其实它的原理也很简单,只需要多加练习,就能熟练掌握这项数据结构,而在整个操作过程中,我们可以发现,我们让某一个节点指向空的之后,并没有对其释放,这是为什么呢,这便是Java的一个强大的功能,垃圾回收,当没有任何地方引用这个对象时,Java就会将其回收。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自定义实现Java ListNode链表 的相关文章

  • 尝试提取 jar 文件时出错

    我正在尝试使用以下命令提取 jar 文件 C Program Files Java jdk1 7 0 25 bin gt jar xf C Users MyJar jar 但出现错误 java io IOException META INF
  • 将字符串转换为整数数组 String at = "1 2 3 4 5" 转换为 ar=[1,2,3,4,5]

    我正在读取一个字符串 作为一整行数字 用空格分隔 即1 2 3 4 5 我想将它们转换为整数数组 以便我可以操作它们 但这段代码不起作用 它说不兼容的类型 String str br readLine int array new int 4
  • XSD 验证错误:在 web.xml 中找不到 TagLib 标记

    我详细显示错误如下 cvc complex type 2 4 a 发现以元素开头的无效内容 taglib One of http java sun com xml ns javaee 描述 http java sun com xml ns
  • 无法从 java 发送 48681 字节消息以保护 wcf 服务

    我必须使用相互身份验证从 java 调用安全的 WCF 服务 一切工作正常 除了我无法发送大小超过 48680 字节的消息 因此 48680 字节的消息已成功发送 但 48681 字节的消息未成功发送 并且 java 应用程序因读取超时异常
  • 从插件设置 Maven 属性

    我在这里阅读了一些关于如何从 Maven 插件设置属性的问题 其中大多数讨论了应用程序的版本号 似乎没有简单的方法可以做到这一点 我发现的最佳解决方案是拥有一个从插件更新的 filter properties 文件 并由主 pom 文件使用
  • Jackson反序列化SNS消息错误MismatchedInputException

    我正在编写一个通过 SNS HTTP 请求处理来自 Amazon Simple Email Service 的回调的功能 我想将亚马逊提供的消息解析为本地对象结构 问题是 SNS 将 JSON 消息包装成字符串 并且 Jackson 无法解
  • java.io.IOException: EnsureRemaining: 仅剩余 0 个字节,尝试读取 1

    我在 giraph 中的自定义类方面遇到一些问题 我制作了 VertexInput 和 Output 格式 但总是收到以下错误 java io IOException ensureRemaining Only bytes remaining
  • 通过 Session.update 和 HibernateTemplate.merge 进行 Hibernate 更新的区别

    我看到了更新操作的类型 第一的 getHibernateTemplate execute new HibernateCallback public Object doInHibernate Session session session f
  • 在类路径中使用通配符调用 java 失败

    我当前目录中有一些 jar 它们都需要位于类路径中 因此我想对类路径使用通配符约定 命令行是 java exe classpath org python util jython args 但是我收到这个错误 Exception in thr
  • 使用枚举变量切换字符串

    我有一个具有不同值的枚举 并且想要切换字符串变量 现在 我在尝试将枚举值转换为字符串 可以用作大小写常量 时遇到了困难 我最好的尝试是将枚举转换为字符串数组 但开关似乎不接受数组值作为大小写常量 IntelliJ 说 需要恒定的表达 Enu
  • HYBRIS - 组件和插槽如何在 JSP 文件中工作?

    最近我正在使用 Hybris 我无法理解这些组件是如何工作的 我知道如何创建和定义一个 如何将它们添加到我想要的页面等 但我不明白如何使用该标签
  • 字节流和字符流

    请解释一下什么是字节流和字符流 这些究竟意味着什么 Microsoft Word 文档是面向字节的还是面向字符的 Thanks 流是一种顺序访问文件的方式 字节流逐字节访问文件 字节流适用于任何类型的文件 但不太适合文本文件 例如 如果文件
  • 如何将空字符串序列化为单个空标签?

    我使用 Simple XML 框架序列化此类 Root public class HowToRenderEmptyTag Element required false private String nullString 我想得到
  • 使用 java 中的准备好的语句插入自定义 SQL 类型

    我有一些自定义类型 它们基本上都是枚举 以下是它们的外观示例 CREATE TYPE card suit AS ENUM spades clubs hearts diamonds 我在 Java 中有一些准备好的语句 看起来像这样 Setu
  • 码头无故停止

    我需要经验丰富的码头用户的建议 我在负载均衡器 亚马逊云 后面维护着 2 台 Linux 机器 使用 Jetty 9 0 3 有时我的 Jetty 容器会被 Thread 2 无故关闭 同时地 显示以下日志并且容器无故停止 没有错误 没有例
  • 在JAVA中将数据写入.txt文件?

    我想知道是否是在JAVA中将计算的数据写入文本文件 我的 JAVA 代码是一个基于 GUI 的 gpa 计算器 我只想添加一个 JButton 和 ActionListener 它将类名 GPA 点和计算出的 GPA 写入 txt 文件 这
  • 未找到 GroovyEvaluator

    我会尝试在以下位置制作我的 PIE 3D 报告iReport 在我的 struts xml 中 我用这个来调用我的报告
  • 如何组织课程、课程包[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 您如何决定包名称应该是什么以及什么类应该放入哪个包中 我正在开发一个项目 在该项目中 我不断添加 删除类 并且不确定我是否需要一个新包 或者应该将其添
  • 启动 Firefox 并等待其关闭

    Question 我想启动 Firefox 网络浏览器作为访问特定网站的过程 然后等到它关闭 一种特殊情况是浏览器可能已经打开并正在运行 因为用户可能已经访问过某个网站 在这种情况下 浏览器可能会在现有窗口中打开一个新选项卡 并且新启动的进
  • 无法验证 serde:org.openx.data.jsonserde.jsonserde

    我编写了这个查询来在配置单元上创建一个表 我的数据最初是 json 格式 所以我已经下载并构建了 serde 并添加了它运行所需的所有 jar 但我收到以下错误 FAILED Execution Error return code 1 fr

随机推荐

  • keras部分介绍

    1 keras 关于batch normalization函数参数axis 3的解释 https www zhihu com question 318398221 tips BN层的作用 1 加速收敛 2 控制过拟合 可以少用或不用Drop
  • 2023年面试问答-二分查找

    正常实现 Input 1 2 3 4 5 key 3 return the index 2 public int binarySearch int nums int key int l 0 h nums length 1 while l l
  • 一键端2

    新仙剑ol 链接 http pan baidu com s 1i3xZHLb 密码 hyly 链接 http pan baidu com s 1c0HgGKw 密码 druj 本帖隐藏的内容 龙之谷133服务端 链接 http pan ba
  • 索琦c语言程序设计第二版第七章,C语言程序设计自学考试大纲(2000年7月版).doc...

    天津市高等教育自学考试课程考试大纲 课程名称 应用程序基础及设计 课程代码 1115 4874 第一部分 课程性质与设置目的 一 课程性质与特点 应用程序基础及设计 课程是高等教育自学考试电子信息工程专业的必修课 是该专业一门重要的基础课
  • Qt实现TCP客户端和服务器通讯程序

    复习的心态过一遍之前基础的一些东西 Qt封装了QTcpServer和QTcpSocket两个类 其中QTcpServer继承自QObject 通过listen 函数监听传入的客户端连接 当Client连接上时 QTcpServer会发出ne
  • 使 QComboBox 下拉一个带复选框的树形列表

    背景 在项目开发过程中需要使 QComboBox 下拉一个树形列表 直接通过 setModel 和 setView 设置 combox 控件可以实现 但是在单击节点箭头按钮时也会隐藏下拉框的显示 因此需要重新实现 QComboBox 的方法
  • 解决vue 路由传参 页面刷新或者后退参数丢失的问题

    vue路由传递参数如果用params传递参数 那么页面刷新就会丢失数据 可以改用query来传递参数 这样刷新就不会丢失 this router push path business bizInspectionTaskSub query f
  • Db2 v11.1 Upgrade to V11.5 HADR 模式

    https www ibm com docs en db2 11 5 topic methods universal versus product specific fix packs Universal versus product sp
  • RocketMQ重置消费位点源码分析

    这里是weihubeats 觉得文章不错可以关注公众号小奏技术 文章首发 拒绝营销号 拒绝标题党 背景 最近在使用RocketMQ的重置消费位点的时候经常出现报错 所以就打算研究下RocketMQ是如何重置消费者的消费位点的 RocketM
  • 图像形态学处理(膨胀腐蚀开闭运算)——数字图像处理学习八(C++版)

    一 基本概念 1 形态学的基本思想是利用一种特殊的结构元来测量或提取输入图像中相应的形状或特征 以便进一步进行图像分析和目标识别 2 图像的形态学处理是对二值图像进行处理 所以在形态学处理前需要将图像二值化 3 结构元可以是任意形状 结构元
  • 可信执行环境(TEE)技术介绍(Trusted Execution Environment)

    本文对当前流行的移动终端TEE技术做简要概述 并对一些细节展开讨论 1 当前移动安全背景 当前移动终端面临这严重的安全威胁 威胁点如下图所示 因此移动厂商 用户 服务提供商等各方都对移动安全提出了强烈的需求 2 REE介绍 Rich Exe
  • 线程安全

    线程安全 多线程的执行顺序不可重现 但是必须要求执行结果必须可以重现 线程的共享数据操作不完整性就一定会出现数据被破坏 而导致结果无法预知的问题 线程的安全问题 同步处理的引入 在java语言中存在两种内建的synchronized语法 s
  • ng-model

    ng model指令用来将input select text area或自定义表单控件同包含它们的作用域中的属性进行绑定 它可以提供并处理表单验证功能 在元素上设置相关的CSS类 ng valid ng invalid等 并负责在父表单中注
  • 【解决】2021-07-30Caused by: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException:

    Caused by org springframework beans factory BeanCreationException Error creating bean with name sqlTemplate defined in U
  • python实现向图像随机添加高斯白噪声,并修改尺寸

    基于python向图像随机添加高斯噪声 并修改尺寸 噪声分布设置为 均值为0 方差分布在0 50之间 coding utf 8 Created on Nov Mon 29 14 09 45 2021 author 瀛台夜雪 import o
  • 【opencv】基于opencv实现人脸识别,从环境搭建到代码实现(超详细教程)

    前言 目标 让计算机通过训练做到认识我或者检测出视频中的人是谁 本文是一个学习笔记 记录一下自己的实现过程 在实现过程中遇到的问题以及个人对知识的理解 一 环境配置 1 软件安装 首先先安装一下必须的软件 python pycharm op
  • 通俗易懂的java设计模式(6)-代理模式

    1 什么是代理模式 为某个对象提供一个代理对象 通过这个代理对象 可以控制对原对象的访问 通俗的解释 我们电脑桌面上的一个个快接方式 当我们点击这个快捷方式的时候 我们就间接地访问到了这个程序 2 静态代理 何为静态 即在程序运行之前 代理
  • java后端解决重复提交问题

    一 为什么会出现重复提交 主要是由于网络的延迟问题以及页面刷新的操作 二 表单的重复提交会导致的问题 主要能够造成很多脏数据 三 解决的办法 3 1 前端解决办法 通过前端的方法将提交按钮变灰 对于前端的办法这里就不做演示了 因为前端的控制
  • C++11标准中按值传递类对象参数的使用时机

    严正声明 本文系作者davidhopper原创 未经许可 不得转载 作为一名资深C 程序员 在C 98 03标准时代 一直将 不得按值传递类对象参数 的规定奉为圭臬 例如 void SetParam const std string nam
  • 自定义实现Java ListNode链表

    写在前面 今天写代码的时候 发现我居然被Java的ListNode的输入卡了半天 所以就打算写一篇博客来整理一下ListNode 链表的定义 首先ListNode就是链表 它的基本结构如下 及一个包含数据 和指针的结构 我们将一个节点的指针