数据结构和算法学习笔记之 03.单向双向链表和环形链表构建

news2025/1/16 14:04:17

5.单向链表

把一个节点Node当做是一个对象,改对象里面包含了数据和指向下一个节点的引用指针

5.1 链表的添加和遍历

5.1.1 思路分析

  • 添加
    • 创建一个head头节点表示链表的头节点,里面的存放数据的data = null
    • 每添加一个元素就直接添加到链表的最后(尾插法)
  • 遍历
    • 通过辅助变量来遍历整个链表节点

List、LinkedHashMap、LinkedHashSet、TreeMap、TreeSet是有序的,List、LinkedHashMap、LinkedHashSet、LinkedHashSet在遍历时会保持添加的顺序,TreeMap、TreeSet在遍历时会以自然顺序(Comparable接口的compareTo)输出

5.1.2 代码实现

package com.tomdd.model;

/**
 * <h1>英雄结点对象</h1>
 * 可以把该节点对象定义为单向链表的内部类
 *
 * @author zx
 * @date 2022年11月12日 10:07
 */
public class SingleHeroNode {
    /**
     * 英雄编号
     */
    public Integer no;

    /**
     * 英雄mc
     */
    public String name;

    /**
     * 昵称
     */
    public String nickName;

    /**
     * 指向下一个英雄结点
     */
    public SingleHeroNode next;

    public SingleHeroNode(Integer no, String name, String nickName) {
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}
package com.tomdd.linkedlist;

import com.tomdd.model.SingleHeroNode;

/**
 * 英雄单向链表
 *
 * @author zx
 * @date 2022年12月21日 10:32
 */
public class HeroSingleLinkedList {
    /**
     * 初始化一个头结点(头结点不能动)
     */
    private SingleHeroNode head = new SingleHeroNode(0, null, null);

    /**
     * 添加结点数据到单向链表
     */
    public void add(SingleHeroNode singleHeroNode) { //尾插发
        //思路:找到结点最后一个结点数据,然后把新增的数据放到结点末尾即可 [不考虑编号顺序]
        //找到末尾结点;然后末尾结点的next域指向新增结点

        //1.定义临时结点
        SingleHeroNode temp = head;
        //2.遍历链表找到最后
        while (true) {
            if (temp.next == null) {
                break;
            }
            //temp 往后移
            temp = temp.next;
        }
        temp.next = singleHeroNode;
    }

    /**
     * <h2>遍历链表</h2>
     * 需要辅助遍历.head结点不能动的。
     */
    public void list() {
        //1.链表是否为空
        if (head.next == null) {
            return;
        }
        SingleHeroNode temp = head.next;
        while (true) {
            if (temp == null) {
                return;
            }

            System.out.println(temp);
            temp = temp.next;

        }
    }
    
}

5.2 按照英雄编号进行顺序添加

5.2.1 思路分析

  • 这里添加的位置是他真正添加的位置的前一个节点,找到这个这个节点后可以直接使用
    • temp.next = newNode; newNode.next = temp.next

5.2.2 代码实现

    /**
     * <h2>按照编号顺序添加</h2>
     * 添加的时候根据no进行排名,也就是插入后根据no排序
     * 根据排名添加英雄,如果已经存在排名给出提示
     * <p>
     * 思路分析:
     * 1.首先找到新添加的位置,是通过辅助指针 temp,也就是temp.next.no > newNode.no
     * <p>
     * 2.newNode.next = temp.next
     * <p>
     * 3.temp.next = newNode
     */
    public void addByOrder(SingleHeroNode singleHeroNode) throws Exception {
        //头结点不能动,通过temp 辅助指针来帮助找到添加的位置。
        //temp.next.no > newNode.no 也就是temp的下一个节点
        // 位于添加位置的前一个节点。
        SingleHeroNode temp = head;
        //标识符,表示添加的编号是否存在,默认为false;
        Boolean flag = false;
        while (true) {
            if (temp.next == null) {
                //说明temp在链表的最后,添加的结点在链表最后
                break;
            }
            if (temp.next.no > singleHeroNode.no) {
                //位置找到。就在 temp  ~ temp.next中间添加新节点
                break;
            }
            if (temp.next.no == singleHeroNode.no) {
                //说明添加的节点已经存在,不能添加
                flag = true;
            }
            //指针后移动
            temp = temp.next;
        }
        if (flag) {
            throw new IllegalAccessException("英雄编号:" + singleHeroNode.no + "已经存在");
        }
        singleHeroNode.next = temp.next;
        temp.next = singleHeroNode;
    }

5.3 链表的修改和删除

5.3.1 思路分析

  • 修改
    • 通过遍历找到需要修改的节点
    • 找到该节点后直接修改节点里面的数据内容
  • 删除
    • 找到该需要删除节点的前面一个节点 ,比如:temp
    • 改指针引用: temp.next = temp.next.next即可

5.3.2 代码实现

    /**
     * <h2>修改结点</h2>
     * 修改名称和昵称
     *
     * @return 返回修改的结点
     */
    public void updateNodeByNo(SingleHeroNode singleHeroNode) throws Exception {
        //根据heroNode的no进行修改
        if (head.next == null) {
            throw new IllegalAccessException("节点链表为空");
        }
        SingleHeroNode temp = head.next;
        //表示是否找到该结点
        Boolean flag = false;
        while (true) {
            if (temp == null) {
                // 表示链表已经结束,没有找到要修改的结点信息
                break;
            }
            if (temp.no == singleHeroNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //根据flag是否找到要修改的结点
        if (flag) {
            temp.name = singleHeroNode.name;
            temp.nickName = singleHeroNode.nickName;
        }
        if (!flag) {
            throw new IllegalAccessException("没有找到编号:" + singleHeroNode.no + "节点信息");
        }
    }


    /**
     * <h2>删除结点</h2>
     * 找到要删除节点的上一个结点
     * <p>
     * 思路分析:
     * 1.先找到需要删除这个节点的前一个节点。【采用临时指针】
     * <p>
     * 2.temp.next = temp.next.next
     * 3.被删除的节点将不会有其他引用指向,将会被GC进行回收
     */
    public void delNode(SingleHeroNode singleHeroNode) throws Exception {
        //head 节点不能动,需要辅助指针temp;然后找到待删除的前一个节点。
        // 比较的时候使用: temp.next.no = delNode.no 进行比较
        SingleHeroNode temp = head;
        //是否找到待删除节点的前一个节点
        Boolean flag = false;
        for (; ; ) {
            if (temp.next == null) {
                //已经到链表最后
                break;
            }
            if (temp.next.no == singleHeroNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }

        if (flag) {
            temp.next = temp.next.next;
        }
        if (!flag) {
            throw new IllegalAccessException("节点编号:" + singleHeroNode.no + "不存在");
        }
    }

5.4 完整的代码

package com.tomdd.linkedlist;

import com.tomdd.model.SingleHeroNode;

import java.util.Stack;

/**
 * <h1>单向链表</h1>
 * <p>
 * 往结点末尾添加,不考虑排序
 *
 * @author zx
 * @date 2022年11月12日 10:00
 */
@SuppressWarnings("all")
public class SingleLinkedList {
    /**
     * 初始化一个头结点(头结点不能动)
     */
    private SingleHeroNode head = new SingleHeroNode(0, null, null);

    /**
     * 添加结点数据到单向链表
     */
    public void add(SingleHeroNode singleHeroNode) { //尾插发
        //思路:找到结点最后一个结点数据,然后把新增的数据放到结点末尾即可 [不考虑编号顺序]
        //找到末尾结点;然后末尾结点的next域指向新增结点

        //1.定义临时结点
        SingleHeroNode temp = head;
        //2.遍历链表找到最后
        while (true) {
            if (temp.next == null) {
                break;
            }
            //temp 往后移
            temp = temp.next;
        }
        temp.next = singleHeroNode;
    }

    /**
     * <h2>按照编号顺序添加</h2>
     * 添加的时候根据no进行排名,也就是插入后根据no排序
     * 根据排名添加英雄,如果已经存在排名给出提示
     * <p>
     * 思路分析:
     * 1.首先找到新添加的位置,是通过辅助指针 temp,也就是temp.next.no > newNode.no
     * <p>
     * 2.newNode.next = temp.next
     * <p>
     * 3.temp.next = newNode
     */
    public void addByOrder(SingleHeroNode singleHeroNode) throws Exception {
        //头结点不能动,通过temp 辅助指针来帮助找到添加的位置。
        //temp.next.no > newNode.no 也就是temp的下一个节点
        // 位于添加位置的前一个节点。
        SingleHeroNode temp = head;
        //标识符,表示添加的编号是否存在,默认为false;
        Boolean flag = false;
        while (true) {
            if (temp.next == null) {
                //说明temp在链表的最后,添加的结点在链表最后
                break;
            }
            if (temp.next.no > singleHeroNode.no) {
                //位置找到。就在 temp  ~ temp.next中间添加新节点
                break;
            }
            if (temp.next.no == singleHeroNode.no) {
                //说明添加的节点已经存在,不能添加
                flag = true;
            }
            //指针后移动
            temp = temp.next;
        }
        if (flag) {
            throw new IllegalAccessException("英雄编号:" + singleHeroNode.no + "已经存在");
        }
        singleHeroNode.next = temp.next;
        temp.next = singleHeroNode;
    }

    /**
     * <h2>删除结点</h2>
     * 找到要删除节点的上一个结点
     * <p>
     * 思路分析:
     * 1.先找到需要删除这个节点的前一个节点。【采用临时指针】
     * <p>
     * 2.temp.next = temp.next.next
     * 3.被删除的节点将不会有其他引用指向,将会被GC进行回收
     */
    public void delNode(SingleHeroNode singleHeroNode) throws Exception {
        //head 节点不能动,需要辅助指针temp;然后找到待删除的前一个节点。
        // 比较的时候使用: temp.next.no = delNode.no 进行比较
        SingleHeroNode temp = head;
        //是否找到待删除节点的前一个节点
        Boolean flag = false;
        for (; ; ) {
            if (temp.next == null) {
                //已经到链表最后
                break;
            }
            if (temp.next.no == singleHeroNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }

        if (flag) {
            temp.next = temp.next.next;
        }
        if (!flag) {
            throw new IllegalAccessException("节点编号:" + singleHeroNode.no + "不存在");
        }
    }

    /**
     * <h2>修改结点</h2>
     * 修改名称和昵称
     *
     * @return 返回修改的结点
     */
    public void updateNodeByNo(SingleHeroNode singleHeroNode) throws Exception {
        //根据heroNode的no进行修改
        if (head.next == null) {
            throw new IllegalAccessException("节点链表为空");
        }
        SingleHeroNode temp = head.next;
        //表示是否找到该结点
        Boolean flag = false;
        while (true) {
            if (temp == null) {
                // 表示链表已经结束,没有找到要修改的结点信息
                break;
            }
            if (temp.no == singleHeroNode.no) {
                flag = true;
                break;
            }
            temp = temp.next;
        }
        //根据flag是否找到要修改的结点
        if (flag) {
            temp.name = singleHeroNode.name;
            temp.nickName = singleHeroNode.nickName;
        }
        if (!flag) {
            throw new IllegalAccessException("没有找到编号:" + singleHeroNode.no + "节点信息");
        }
    }


    /**
     * <h2>遍历链表</h2>
     * 需要辅助遍历.head结点不能动的。
     */
    public void list() {
        //1.链表是否为空
        if (head.next == null) {
            return;
        }
        SingleHeroNode temp = head.next;
        while (true) {
            if (temp == null) {
                return;
            }

            System.out.println(temp);
            temp = temp.next;

        }
    }


    /**
     * <h2>链表个数</h2>
     * 获取单向链表有效个数,不统计头节点
     */
    public synchronized int size() {
        //链表为空
        if (head.next == null) {
            return 0;
        }
        int size = 0;
        SingleHeroNode currentNode = head.next;
        while (currentNode != null) {
            size++;
            currentNode = currentNode.next;
        }
        return size;
    }

    /**
     * <h2>查找单链表中倒数第K个结点</h2>
     * 思路:
     * 1. 编写一个方法,接收index,表示倒数第index节点
     * <p>
     * 2.遍历链表得到这个链表的总个数
     * <p>
     * 3. 得到size个数后,我们从链表的第一个开始遍历(size-index)就可以得到
     */
    public SingleHeroNode getLastIndexNode(int index) {
        int size = size();
        //链表为空返回空
        if (size == 0) {
            return null;
        }
        //第二次遍历(size-index)就是倒数index的节点
        if (index <= 0 || index > size) {
            return null;
        }
        SingleHeroNode temp = head.next;
        for (int i = 0; i < (size - index); i++) {
            temp = temp.next;
        }

        return temp;
    }

    /**
     * <h2>反转链表</h2>
     */
    public void reverse() {
        //空链表或者只有一个节点不用反转
        if (head.next == null || head.next.next == null) {
            return;
        }
        //当前节点
        SingleHeroNode curr = head.next;
        //记录当前节点的下一个节点。
        SingleHeroNode currNext = null;

        SingleHeroNode reverseHead = new SingleHeroNode(0, null, null);
        //遍历原来的链表 ,并放到反转的链表头,并且放到新的节点的前面。
        while (curr != null) { //头插法
            //先暂时保持当前节点的下一个节点,便于节点往下遍历
            currNext = curr.next;

            //当前节点下一个节点指向反转节点的下一个节点[进行构建新的反转链表]
            curr.next = reverseHead.next;
            //将curr连接到新的链表上
            reverseHead.next = curr;

            curr = currNext;
        }
        head.next = reverseHead.next;
    }

    public void reversePrintByStack(){
        if(head.next == null){
            //空链表不打印
            return;
        }
        //将节点压入栈中
        Stack<SingleHeroNode> singleHeroNodeStack = new Stack<>();
        SingleHeroNode temp = head.next;
        while(temp !=null){
            singleHeroNodeStack.push(temp);
            temp = temp.next;
        }

        while(singleHeroNodeStack.size()>0){
            System.out.println(singleHeroNodeStack.pop());
        }

    }

}

6.双向链表

package com.tomdd.model;

/**
 * 双向节点英雄结点对象
 * <p>
 * 可以定义为内部类
 *
 * @author zx
 * @date 2022年11月13日 18:59
 */
public class DoubleHeroNode {
    /**
     * 英雄编号
     */
    public Integer no;

    /**
     * 英雄mc
     */
    public String name;

    /**
     * 昵称
     */
    public String nickName;

    /**
     * 指向下一个英雄结点
     */
    public DoubleHeroNode next;

    /**
     * 指向上一个节点
     */
    public DoubleHeroNode pre;

    public DoubleHeroNode(Integer no, String name, String nickName) {
        this.no = no;
        this.name = name;
        this.nickName = nickName;
    }

    @Override
    public String toString() {
        return "HeroNode{" +
                "no=" + no +
                ", name='" + name + '\'' +
                ", nickName='" + nickName + '\'' +
                '}';
    }
}

package com.tomdd.linkedlist;

import com.tomdd.model.DoubleHeroNode;

/**
 * 双向链表
 *
 * @author zx
 * @date 2022年11月13日 18:58
 */
public class DoubleLinkedList {

    /*
    双向链表的CRUD思路分析:
    1.遍历的方式和单链表的方式一样,只是可以向前、向后查找
    2.添加:
        默认添加到链表最后
        1.辅助节点找到链表末尾,next 指向为空就是链表的末尾
        2.temp.next = newHeroNode 末尾结点下一个节点指向新增的节点
        3.newHeroNode.pre = temp; 维护新增结点的上一个结点

    3.修改: 修改的思路和单向链表的修改思路是一样。
    4.删除: 双向链表中有上一个和下一个节点的引用,可以实现自我删除,找到要删除节点。
        temp.pre.next = temp.next
        temp.next.pre = temp.pre
     */
    /**
     * 头结点
     */
    private final DoubleHeroNode head = new DoubleHeroNode(0, null, null);


    public void add(DoubleHeroNode newHeroNode) {
        if (head.next == null) {
            head.next = newHeroNode;
            newHeroNode.pre = head;
            return;
        }
        DoubleHeroNode temp = head.next;
        //2.遍历链表找到最后
        while (temp !=null) {
            //temp 往后移
            temp = temp.next;
        }
        temp.next = newHeroNode;
        newHeroNode.pre = temp;

    }


    public void list() {
        if (head.next == null) {
            return;
        }
        DoubleHeroNode temp = head.next;
        while (temp != null) {
            System.out.println(temp);
            temp = temp.next;
        }


    }
}

7.使用for循环遍历链表另一种形式

package com.mayikt.linkedlist;

/**
 * 单向链表
 *
 * @author zx
 * @date 2022年01月28日 16:10
 */
public class SingleLinkedList<T> {

    /**
     * 头结点
     */
    transient Node<T> firstNode;

    /**
     * 链表结点个数
     */
    int size = 0;


    /**
     * 把元素添加到链表的头结点
     *
     * @param t 添加的元素
     * @return true表示添加成功
     */
    public boolean add(T t) {
        addNodeToHead(t);
        return true;
    }

    private void addNodeToHead(T t) {
        Node<T> tempNode = firstNode;
        firstNode = new Node<>(t, tempNode);
        size++;
    }

    public void showInfo() {

        Node<T> temp = firstNode;

        while (true) {
            System.out.println(temp.item);
            if (temp.nextEntry == null) {
                //链表遍历到最后了
                break;
            }
            temp = temp.nextEntry;

        }
    }


    /**
     * 使用for循环遍历单向链表的写法
     */
    public void foreEach() {
        for (Node<T> temp = firstNode; temp != null; temp = temp.nextEntry) {
            System.out.println(temp.item);
        }
    }

    static class Node<T> {
        T item;

        Node<T> nextEntry;

        public Node(T item, Node<T> nextEntry) {
            this.item = item;
            this.nextEntry = nextEntry;
        }
    }

    public static void main(String[] args) {
        SingleLinkedList<String> singleLinkedList = new SingleLinkedList<>();
        singleLinkedList.add("I");
        singleLinkedList.add("LOVE");
        singleLinkedList.add("YOU");

        singleLinkedList.showInfo();
        System.out.println("--------------使用for循环遍历链表:------------------");
        singleLinkedList.foreEach();
    }
}

8.环形链表

8.1 思路分析

8.2 代码实现

package com.mayikt.circle_linked;

/**
 * <h1>环形链表</h1>
 *
 * @author zx
 * @date 2022年07月12日 8:18
 */
public class CircleLinked {

    /**
     * 环形链表的第一个节点
     */
    private Body first = new Body(-1);

    /**
     * <h2>构建环形链表</h2>
     *
     * @param num 环形链表的节点数
     */
    public void buildCircleLinked(int num) {
        if (num < 1) {
            throw new RuntimeException("节点数应该大于1");
        }
        //当前节点(辅助节点)
        Body currentBody = null;
        for (int i = 1; i <= num; i++) {
            Body body = new Body(i);
            if (i == 1) {
                first = body;
                //第一个节点进行自关联
                first.setNext(first);
                //辅助遍历 复制为第一个节点
                currentBody = first;
                continue;
            }
            //添加第二个节点的时候
            currentBody.setNext(body);
            body.setNext(first);
            //移动当前节点为新增的节点
            currentBody = body;
        }

    }

    /**
     * <h2>打印环形链表</h2>
     */
    public void printCircleLinked() {
        if (first.getNo() == -1) {
            throw new RuntimeException("环形链表为空");
        }
        Body currentBody = first;
        while (true) {

            System.out.println(currentBody.getNo());
            currentBody = currentBody.getNext();
            if (currentBody.getNext() == first) {
                System.out.println(currentBody.getNo());
                break;
            }

        }
    }

    /**
     * <h2>环形链表节点</h2>
     */
    static class Body {
        private Integer no;
        private Body next;

        public Body(Integer no) {
            this.no = no;
        }

        public Integer getNo() {
            return no;
        }

        public void setNo(Integer no) {
            this.no = no;
        }

        public Body getNext() {
            return next;
        }

        public void setNext(Body next) {
            this.next = next;
        }
    }
}

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

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

相关文章

Practise test day9

另类加法_牛客网 解题思路&#xff1a;位运算符 1 0001 2 0010 按位与&&#xff1a;如果两个二进制位都为1&#xff0c;则返回1&#xff0c;否则返回0 按位异或&#xff1a;两个二进制位相同返回0&#xff0c;不同返回1。 1.二进制位异或的结果&#xff0c;是两个数对应相加…

https-OPenSSL证书生成及自签名证书

目录 SSL/TLS 1、搭建OPenssl服务器 1.1、下载 1.2、安装下载好的exe程序 2、服务器端证书-生成key、CSR、CRT 2.1、进入如下目录&#xff0c;执行cmd 2.2、生成一个私钥key 2.3、由生成的私钥key生成一个待签名的CSR证书文件(公钥) 2.4、查看证书内容 3、自建CA证书 3.1…

跨境电商卖家如何创建客户参与的 Facebook 广告?

关键词&#xff1a;跨境电商卖家、客户参与、Facebook广告 想要从您的 Facebook 广告中获得更多潜在客户或转化&#xff1f;正在寻找为您自己的广告建模的成功秘诀&#xff1f; 在本文中&#xff0c;您将了解创建消费者响应的 Facebook 广告的八个技巧。 将您现有的 Facebook 受…

零基础能否转行做程序员,那些半路出家的程序员大神给你做了榜样

这些年&#xff0c;随着中国互联网产业的高速发展&#xff0c;对程序员这个职业的需求越来越大。而相对较高的薪水、简单的人际关系、入行不需要靠拼爹这些优点&#xff0c;也让越来越多的年轻人选择了这个职业。甚至很多本来已经从事了其他行业的年轻人&#xff0c;也都想转行…

Promise(三) promise自定义封装25-35

1.初始结构搭建 2.resolve和reject结构搭建 3.throw抛出异常改变状态 4.promise对象状态只能修改一次 5.then方法执行回调 6.指定多个回调的实现 7.同步修改状态then方法结果返回 8.异步修改状态then方法结果返回 9.then方法完善与优化 10.catch方法——异常穿透与值管…

网络技术基础复习——计算机网络基本概念七层模型

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 前言 本章将会复习网络技术的一些知识&#xff0c;了解网络基础概念&#x…

如何学习python?python该怎么学?如何高效率学习python?分享python的学习资料和网站

如何学习python&#xff1f; 1、学好python的第一步&#xff0c;就是马上到网站上下载一个python版本。我建议初学者&#xff0c;不要下载具有IDE功能的集成开发环境&#xff0c;比如Eclipse插件等。 2、下载完毕后&#xff0c;就可以开始学习了。学习过程中&#xff0c;我建议…

商业报表工具-FineReport JS 实现动态隐藏参数以及控制参数面板高度

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 预期效果 开发报表的时&#xff0c;经常会遇到使用的参数控件较多的情况&#xff0c;这时候可以对一些不常用、不需要展现出来的的控件进行隐藏&#xff0c;当需要展示的时候再使其展示出来&#xff0c;如下图所示&…

数字化信道

数字化信道 数字化信道主要包括多相滤波和DFT两个模块。 多相滤波 多相滤波&#xff0c;就是将滤波器系数按照相数进行重排。在D倍抽取后&#xff0c;整个频带的频谱将混叠在0频附近[−Fs2D,Fs2D)[-\frac{F_s}{2D} ,\frac{F_s}{2D})[−2DFs​​,2DFs​​)。因此&#xff0c;…

超标量处理器设计——第四章_分支预测

超标量处理器设计——第四章_分支预测 参考《超标量处理器》姚永斌著 4.1 简述 分支预测主要与预测两个内容, 一个是分支方向, 还有一个是跳转的目标地址首先需要识别出取出的指令是否是分支指令, 如果是需要送入方向和地址预测模块: 分支预测最好的时机就是当前周期取到指令地…

【C++】拷贝构造函数

目录 默认拷贝构造函数 拷贝构造函数的原型&#xff1a; 为什么不用值传递&#xff1f; 为什么不用指针传递&#xff1f; 调用拷贝构造函数的3种情况 (旧对象去构造新对象) 我们熟悉的类型有以下操作&#xff1a; 1.声明&#xff1a;int a; 2.声明并初始化&#xff1a;in…

圣诞节怎么能缺少圣诞树呢?Python+HTML打造专属于你的圣诞树

前言&#xff1a; 美酒一杯让人醉&#xff0c;温馨陪伴浪漫随;雪花片片惹人爱&#xff0c;烦恼忧伤全不见;字里行间藏真情&#xff0c;文短情深送心愿:圣诞佳节快来到&#xff0c;祝大家永远开心幸福! Hello大家好&#xff0c;我是Dream。 圣诞节马上到了&#xff0c;一些朋友问…

非零基础自学Golang 第14章 反射 14.2 基本用法 14.2.1 获取类型信息

非零基础自学Golang 文章目录非零基础自学Golang第14章 反射14.2 基本用法14.2.1 获取类型信息第14章 反射 14.2 基本用法 在使用反射时&#xff0c;我们会经常使用到反射的种类&#xff08;Kind&#xff09;&#xff0c;reflect.Kind在Go语言reflect包中的定义如下&#xff…

认知水平越低的人,越喜欢回复“收到”

前几天后台有位粉丝留言&#xff1a; “有一次回复’收到’&#xff0c;竟被领导痛批一顿&#xff01; 领导什么活都让我干&#xff0c;找资料、填表格、开会&#xff0c;虽然明知忙不过来&#xff0c;内心也不乐意做个打杂工&#xff0c;但嘴巴却只能缓缓吐出‘收到’两个字……

设计模式之中介者模式

Mediator design pattern 中介者模式的概念、中介者模式的结构、中介者模式的优缺点、中介者模式的使用场景、中介者模式的实现示例、中介者模式的源码分析 1、中介者模式的概念 中介者模式&#xff0c;又称调停模式&#xff0c;即定义一个中介者来封装原有多个对象之间的依赖…

SpringBoot中Redis使用之jedis

目录 pom.xml中导入坐标 application.yml添加配置 lettcus与jedis区别 本人springboot版本2.7.6&#xff0c;redis版本5.0.14.1亲测可用 pom.xml中导入坐标 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId&…

大学生自学Python去面试,月薪为何如此少?问题究竟出在哪?

市场上需要的Python人员非常多&#xff0c;而且按照现在的势头&#xff0c;以后会需要更多的Python开发人员&#xff0c;理由是以后每个人公司都会有自己的网站&#xff0c;有自己的开发部&#xff0c;对于用户体验看的非常重要。所以Python程序员就会很吃香。随时时间的推移&a…

62354-43-2,标记肽vLK-对硝基苯胺

很多蛋白在细胞中非常容易被降解&#xff0c;或被标记&#xff0c;进而被选择性地破坏。但含有部分D型氨基酸的多肽则显示了很强的抵抗蛋白酶降解能力。 纤溶酶和微纤溶酶的底物。微纤溶蛋白水解D-VLK-pNA的Km为0.361 /- 0.017 mM, kcat为40.3 /- 3.3 s&#xff0c;而原生纤溶蛋…

非零基础自学Golang 第12章 接口与类型 12.2 接口的创建与实现 12.2.2 接口赋值

非零基础自学Golang 文章目录非零基础自学Golang第12章 接口与类型12.2 接口的创建与实现12.2.2 接口赋值第12章 接口与类型 12.2 接口的创建与实现 12.2.2 接口赋值 如果用户自定义的类型实现了某个接口类型所声明的一组方法&#xff0c;那么这个用户定义的类型的值就可以赋…

2021遥感应用组三等奖:基于PolSAR和高光谱遥感的黄河口湿地协同分类研究

作品介绍 一、作品概述 受人类活动和气候变化的影响,滨海湿地正经历着显著的变化。滨海湿地生态系统的监测具有重要的现实意义。同时,随着卫星遥感技术的快速发展,可以利用高空间分辨率、高光谱分辨率和高时间分辨率的多源数据对滨海湿地进行高精度分类。 本作品利用珠海1…