节点加入到单链表时按需求排序

节点,加入,单链,需求,排序 · 浏览次数 : 15

小编点评

**思路①** 1. 使用遍历遍历链表,将元素的id与数据进行比较,如果发现数据与目标id一致,则说明该元素已存在,打印提示信息并退出程序。 2. 如果发现数据与目标id不一致,则将该元素的id与下一个元素的id进行比较,如果发现该元素的id大于下一个元素的id,则说明该元素可添加。 3. 继续遍历过程,直到找到第一个大于目标id的元素,则说明该元素是链表的结尾,此时将该元素的id与目标id进行比较,如果发现匹配,则说明元素已存在,打印提示信息并退出程序。 **思路②** 1. 使用 `HashMap` 或其他数据结构来存储元素的id和数据,并在遍历过程中检查元素的id是否存在于 HashMap 中。 2. 如果元素的id存在于 HashMap 中,则说明该元素已存在,打印提示信息并退出程序。 3. 如果元素的id不在 HashMap 中,则将该元素的id与目标id进行比较,如果发现匹配,则说明元素已存在,打印提示信息并退出程序。

正文

JAVA实现节点加入到单链表时按需求排序

回顾

在上文《带头节点的单链表的思路及代码实现(JAVA)》中我们想要去实现让数据节点不考虑加入顺序实现数据节点排序效果。

那么我们要如何实现这一需求呢?

一、实现思路

①理论思路

假设我们要根据数据节点的ID进行排序,那么我们可以通过使用待增加的节点id逐一遍历链表节点,直到找到要插入位置的前一个节点,将要插入位置的后一个节点的引用赋值给待插入节点的next域,然后再将待插入节点的引用赋值给待插入节点前一个位置的next域,这样就实现了链表数据节点的顺序加入。

②图解思路

image-20230327162128870

二、实现代码

①带id的数据节点类

这里为了展示排序效果,数据节点类较上次增添了id属性,用于实现根据id排序。

// 带ID的数据节点类
class IdDataNode{

    private int id; // 用来作为排序依据,即实现以id进行排序的单链表
    private String data;    // data域,要存储的数据
    private IdDataNode next;  // next域,用于指向下一个数据节点地址

    // 数据节点构造器
    public IdDataNode(int id, String data) {
        this.id = id;
        this.data = data;
    }

    @Override
    public String toString() {
        return "IdDataNode{" +
                "id=" + id +
                ", data='" + data + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public IdDataNode getNext() {
        return next;
    }

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

②实现根据id排序存储的链表增加和显示方法

方法实现思路均已在代码注释中说明。

/**
 * ClassName: SingleLinkedListAddOrder
 * Package: com.zhao.test
 * Description:
 *
 * @Author XH-zhao
 * @Create 2023/3/27 13:31
 * @Version 1.0
 */
public class SingleLinkedListAddOrder {

    // 创建单链表头节点
    private IdDataNode head = new IdDataNode(0,"");

    // 将数据节点按照数据id添加进链表
    public void addByIdOrder(IdDataNode idDataNode){

        // 使用辅助变量temp代替head进行移动
        IdDataNode temp = head;

        while(true){

            // 说明temp走到了最后,必须要添加元素了(添加到最后)
            if(temp.getNext() == null){
                break;
            }

            // temp节点的后一个节点的id比要添加节点的id大代表可以添加元素了
            if(temp.getNext().getId() > idDataNode.getId()){
                break;
            }else if(temp.getNext().getId() == idDataNode.getId()){
                System.out.println("您添加的元素已经存在了!!");
                // 直接结束方法
                return;
            }

            // 将temp元素后移(继续遍历)
            temp = temp.getNext();
        }

        // 当遍历结束时,temp已经指向了要插入的位置的前一个节点(开始插入)
        idDataNode.setNext(temp.getNext());
        temp.setNext(idDataNode);
    }

    // 遍历整个链表
    public void showLinkedListAll() {
        // 当链表为空时不进行遍历,直接结束
        if(head.getNext() == null) {
            System.out.println("链表为空");
            return;
        }
        // 遍历链表时同样需要辅助变量,因为head节点不能移动,否则就找不到该链表了
        IdDataNode temp = head;
        while(true) {
            // 当链表为空时,不进行遍历,直接结束循环
            if(temp.getNext() == null) {
                break;
            }
            // 直接输出链表节点存的数据
            System.out.println(temp.getNext());
            //将temp指针往后移动
            temp = temp.getNext();
        }
    }
}

三、实验测试单链表按id排序增添的代码准确性

①单链表根据id排序存储实现以及测试的整体代码

/**
 * ClassName: SingleLinkedListAddOrder
 * Package: com.zhao.test
 * Description:
 *
 * @Author XH-zhao
 * @Create 2023/3/27 13:31
 * @Version 1.0
 */
public class SingleLinkedListAddOrder {

    // 创建单链表头节点
    private IdDataNode head = new IdDataNode(0,"");

    // 将数据节点按照数据id添加进链表
    public void addByIdOrder(IdDataNode idDataNode){

        // 使用辅助变量temp代替head进行移动
        IdDataNode temp = head;

        while(true){

            // 说明temp走到了最后,必须要添加元素了(添加到最后)
            if(temp.getNext() == null){
                break;
            }

            // temp节点的后一个节点的id比要添加节点的id大代表可以添加元素了
            if(temp.getNext().getId() > idDataNode.getId()){
                break;
            }else if(temp.getNext().getId() == idDataNode.getId()){
                System.out.println("您添加的元素已经存在了!!");
                // 直接结束方法
                return;
            }

            // 将temp元素后移(继续遍历)
            temp = temp.getNext();
        }

        // 当遍历结束时,temp已经指向了要插入的位置的前一个节点(开始插入)
        idDataNode.setNext(temp.getNext());
        temp.setNext(idDataNode);
    }

    // 遍历整个链表
    public void showLinkedListAll() {
        // 当链表为空时不进行遍历,直接结束
        if(head.getNext() == null) {
            System.out.println("链表为空");
            return;
        }
        // 遍历链表时同样需要辅助变量,因为head节点不能移动,否则就找不到该链表了
        IdDataNode temp = head;
        while(true) {
            // 当链表为空时,不进行遍历,直接结束循环
            if(temp.getNext() == null) {
                break;
            }
            // 直接输出链表节点存的数据
            System.out.println(temp.getNext());
            //将temp指针往后移动
            temp = temp.getNext();
        }
    }
}

// 带ID的数据节点类
class IdDataNode{

    private int id; // 用来作为排序依据,即实现以id进行排序的单链表
    private String data;    // data域,要存储的数据
    private IdDataNode next;  // next域,用于指向下一个数据节点地址

    // 数据节点构造器
    public IdDataNode(int id, String data) {
        this.id = id;
        this.data = data;
    }

    @Override
    public String toString() {
        return "IdDataNode{" +
                "id=" + id +
                ", data='" + data + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    public IdDataNode getNext() {
        return next;
    }

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

// 测试类
class SingleLinkedListAddOrderTest{
    public static void main(String[] args) {

        // 创建四个数据节点,id分别是1-2-3-4
        IdDataNode dataNode1 = new IdDataNode(1, "data1");
        IdDataNode dataNode2 = new IdDataNode(2, "data2");
        IdDataNode dataNode3 = new IdDataNode(3, "data3");
        IdDataNode dataNode4 = new IdDataNode(4, "data4");

        // 创建带头节点的单链表
        SingleLinkedListAddOrder singleLinkedListAddOrder = new SingleLinkedListAddOrder();

        // 将四个数据节点以id为4-1-3-2的顺序加入到链表
        singleLinkedListAddOrder.addByIdOrder(dataNode4);
        singleLinkedListAddOrder.addByIdOrder(dataNode1);
        singleLinkedListAddOrder.addByIdOrder(dataNode3);
        singleLinkedListAddOrder.addByIdOrder(dataNode2);

        // 显示链表中元素,查看是否实现排序效果
        singleLinkedListAddOrder.showLinkedListAll();

        System.out.println("*******************************");
        // 增加一个重复数据节点,查看输出结果
        singleLinkedListAddOrder.addByIdOrder(dataNode2);

    }
}

②实验结果

IdDataNode{id=1, data='data1'}
IdDataNode{id=2, data='data2'}
IdDataNode{id=3, data='data3'}
IdDataNode{id=4, data='data4'}
*******************************
您添加的元素已经存在了!!

进程已结束,退出代码0

从上述结果中,我们就实现了带头节点的单链表通过id排序的数据存储设计。

与节点加入到单链表时按需求排序相似的内容:

节点加入到单链表时按需求排序

JAVA实现节点加入到单链表时按需求排序 回顾 在上文《带头节点的单链表的思路及代码实现(JAVA)》中我们想要去实现让数据节点不考虑加入顺序实现数据节点排序效果。 那么我们要如何实现这一需求呢? 一、实现思路 ①理论思路 假设我们要根据数据节点的ID进行排序,那么我们可以通过使用待增加的节点id逐

前缀树(Tire)—Python

核心思想 空间换时间,是一种用于快速查询的多叉树结构,利用字符串的公共前缀来降低时间 优缺点: 优点:查询效率高,减少字符比较 缺点:内存消耗较大 每次都会从头向下一直到字符串结尾 前缀树 1 单个字符串从前到后加到一棵多叉树上 2 每隔字符串都会有自己所在节点的两个属性path和end,path代

云原生场景下实现编译加速

云原生下的流水线是通过启动容器来运行具体的功能步骤,每次运行流水线可能会被调度到不同的计算节点上。这会导致一个问题:容器运行完是不会保存数据的,每当流水线重新运行时,又会重新拉取代码、编译代码、下载依赖包等等。在云原生场景下,不存在本地宿主机编译代码、构建镜像时缓存的作用,大大延长了流水线运行时间,浪费很多不必要的时间、网络和计算成本。

[转帖]如何添加自定义CA根证书到操作系统获得信任

https://www.qiansw.com/add-the-ca-root-certificate-to-the-operating-system-for-trust.html 现在很多网站和服务都使用了HTTPS进行链路加密、防止信息在传输中间节点被窃听和篡改。HTTPS的启用都需要一个CA证书

2.13 PE结构:实现PE代码段加密

代码加密功能的实现原理,首先通过创建一个新的`.hack`区段,并对该区段进行初始化,接着我们向此区段内写入一段具有动态解密功能的`ShellCode`汇编指令集,并将程序入口地址修正为`ShellCode`地址位置处,当解密功能被运行后则可释放加密的`.text`节,此时再通过一个`JMP`指令跳转到原始`OEP`位置,则可继续执行解密后的区段。

[WPF]浅析依赖属性(DependencyProperty)

在WPF中,引入了依赖属性这个概念,提到依赖属性时通常都会说依赖属性能节省实例对内存的开销。此外依赖属性还有两大优势。 支持多属性值,依赖属性系统可以储存多个值,配合Expression、Style、Animation等可以给我们带来很强的开发体验。 加入了属性变化通知,限制、验证等功能。方便我们使

使用c#强大的表达式树实现对象的深克隆

一、表达式树的基本概念 表达式树是一个以树状结构表示的表达式,其中每个节点都代表表达式的一部分。例如,一个算术表达式 a + b 可以被表示为一个树,其中根节点是加法运算符,它的两个子节点分别是 a 和 b。在 LINQ(语言集成查询)中,表达式树使得能够将 C# 中的查询转换成其他形式的查询,比如

Trino418版本动态加载catalog不需要重启集群修改思路及实现2

原来没事的时候改了一个这样的功能,当时也没有仔细研究,后来也没继续弄。详细可以参考 https://www.cnblogs.com/liuzx8888/p/17635913.html 当时有1个问题:新增数据源需要每一个节点都去调取API注册,这样非常麻烦,最近闲下来又研究了一下,在原先的基础上做了

【最佳实践】MongoDB导出导入数据

首先说一下这个3节点MongoDB集群各个维度的数据规模: 1、dataSize: 1.9T 2、storageSize: 600G 3、全量备份-加压缩开关:186G,耗时 8h 4、全量备份-不加压缩开关:1.8T,耗时 4h27m 具体导出的语法比较简单,此处不再赘述,本文重点描述导入的优化过

Java进阶:HashMap底层原理(通俗易懂篇)

1.底层结构 Java 7及之前版本 在Java 7及之前的版本中,HashMap的底层数据结构主要是数组加链表。具体实现如下: 数组:HashMap的核心是一个Entry数组(Entry[] table),这个数组的大小总是2的幂。每个数组元素是一个单一的Entry节点,或者是一个链表的