首页 > 其他分享 >节点加入到单链表时按需求排序

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

时间:2023-04-08 14:13:55浏览次数:42  
标签:单链 temp 表时 节点 public id data IdDataNode

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排序的数据存储设计。

标签:单链,temp,表时,节点,public,id,data,IdDataNode
From: https://www.cnblogs.com/zhao-XH/p/17298430.html

相关文章

  • JAVA实现单链表修改和删除数据节点
    JAVA实现单链表修改和删除数据节点一、修改单链表中的一个节点①实现思路因为带头节点的链表中头节点的next域不能发生改变(始终指向单链表的头节点),否则将找不到该链表。所以我们需要先找一个辅助节点temp来进行节点代理操作。通过遍历链表,使辅助节点temp后移,找到要修改的节点......
  • k8s节点变配pod驱逐操作
    说明:日常运维中或多或少遇到k8s节点调整配置,或者k8s集群中某节点有问题,需要下架操作。以k8s集群中节点172.24.80.2节点需要扩容为例,共三步:#暂停节点172.24.80.2调度,使节点172.24.80.2不可用,使节点不接收新的podkubectlcordon172.24.80.2#驱逐节点上运行的pod到其他节点,kube......
  • 动力节点王鹤SpringBoot3笔记——第四章 访问数据库
    视频:动力节点SpringBoot3从入门到项目实战第四章访问数据库SpringBoot框架为SQL数据库提供了广泛的支持,既有用JdbcTemplate直接访问JDBC,同时支持“objectrelationalmapping”技术(如Hibernate,MyBatis)。SpringData独立的项目提供对多种关系型和非关系型数据库的访问支持。......
  • 动力节点王鹤SpringBoot3笔记—— 第二章 掌控SpringBoot基础篇
    第二章掌控SpringBoot基础篇2.1SpringBoot?SpringBoot是目前流行的微服务框架倡导约定优先于配置”其设目的是用来简化新Spring应用的初始化搭建以及开发过程。SpringBoot提供了很多核心的功能,比如自动化配置starter(启动器)简化Maven配置、内嵌Servlet容......
  • 动力节点王鹤SpringBoot3笔记——第五章 说说Web服务
    第五章说说Web服务基于浏览器的B/S结构应用十分流行。SpringBoot非常适合Web应用开发。可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个SpringBoot的Web应用能够自己独立运行,不依赖需要安装的Tomcat,Jetty等。SpringBoot可以创建两种类型的Web应......
  • 动力节点王鹤SpringBoot3学习笔记——第五章 说说Web服务
    第五章说说Web服务基于浏览器的B/S结构应用十分流行。SpringBoot非常适合Web应用开发。可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个SpringBoot的Web应用能够自己独立运行,不依赖需要安装的Tomcat,Jetty等。SpringBoot可以创建两种类型的Web应......
  • 动力节点王鹤SpringBoot3学习笔记——第五章 说说Web服务
    第五章说说Web服务基于浏览器的B/S结构应用十分流行。SpringBoot非常适合Web应用开发。可以使用嵌入式Tomcat、Jetty、Undertow或Netty创建一个自包含的HTTP服务器。一个SpringBoot的Web应用能够自己独立运行,不依赖需要安装的Tomcat,Jetty等。SpringBoot可以创建两种类型的Web应......
  • GaussDB(DWS)集群中寻找节点CPU占用高的语句
    摘要:本文主要通过实例讲解如何通过gs_cpuwatcher.sh脚本寻找CPU占用高语句。本文分享自华为云社区《GaussDB(DWS)gs_cpuwatcher.sh脚本如何寻找CPU占用高语句》,作者:fighttingman。【工具名称】gs_cpuwatcher【功能描述】1.寻找集群内节点占用CPU高的语句【使用场景】CPUsys使用......
  • GaussDB(DWS)集群中寻找节点CPU占用高的语句
    摘要:本文主要通过实例讲解如何通过gs_cpuwatcher.sh脚本寻找CPU占用高语句。本文分享自华为云社区《GaussDB(DWS)gs_cpuwatcher.sh脚本如何寻找CPU占用高语句》,作者:fighttingman。【工具名称】gs_cpuwatcher【功能描述】1.寻找集群内节点占用CPU高的语句【使用场景】CP......
  • bp神经网络交叉验证算法和确定最佳隐含层节点个数matlab 程序
    bp神经网络交叉验证算法和确定最佳隐含层节点个数matlab程序,直接运行即可。数据excel格式,注释清楚,效果清晰,一步上手。YID:6859628310735572......